Learning about crg

607 阅读6分钟

在计算机系统或嵌入式系统中,CRG(Clock and Reset Generator)模块是一个用于生成时钟信号和处理复位逻辑的模块。CRG模块的主要功能是确保系统的时钟信号稳定可靠,并在需要时处理系统的复位。

以下是CRG模块的一些关键功能和特点:

  1. 时钟生成: CRG模块负责生成系统内部各个组件所需的时钟信号。这些时钟信号可能具有不同的频率,根据系统的需求进行配置。
  2. 时钟分频: CRG模块通常允许对时钟信号进行分频,以便满足不同部件的时钟要求。这可以提高系统的灵活性,使其适应不同的工作模式和功耗需求。
  3. 复位逻辑: CRG模块包含处理系统复位的逻辑电路。复位信号可用于在系统启动时将各个组件置于已知的初始状态,确保系统正常运行。
  4. 时钟切换: 有些系统需要在运行时切换时钟源或时钟频率,以满足不同的性能或功耗要求。CRG模块可能支持时钟切换功能,使系统能够在不同模式之间进行平滑切换。
  5. 时钟锁相环(PLL): 一些CRG模块集成了PLL,用于产生高稳定性和精确频率的时钟信号。PLL可以通过反馈机制来调整输出频率,以使其与参考时钟同步。
  6. 时钟同步: 在多核系统或分布式系统中,CRG模块可能支持时钟同步功能,以确保各个处理单元之间的时钟保持同步,防止数据通信和协同操作时出现问题。
  7. 低功耗模式: 为了节约能源,一些CRG模块支持低功耗模式,其中时钟源和模块可以在不需要时进入睡眠状态或调整为低功耗状态。

CRG模块的设计和功能会根据具体的芯片架构和应用场景而有所不同。在嵌入式系统中,特别是在处理器、微控制器或FPGA等设备中,CRG模块是确保系统正常运行和满足性能要求的关键组成部分。

1. 复位方式:异步复位,同步释放

为什么需要异步复位,同步释放?

原因主要是:

  • 如果同步复位,同步释放,需要对复位信号进行同步,对于外部复位来讲容易形成锁死的问题。这是个鸡生蛋蛋生鸡的问题。复位信号用寄存器同步,然后用同步后的信号复位寄存器,我复位我自己?所以同步复位同步释放多用于软复位。
  • 如果异步复位,异步释放,异步的释放操作非常容易导致亚稳态。相当于没有复位。
  • 如果同步复位,异步释放,emmm 感觉上一般没有人这么折腾自己。

所以就剩下了一种办法,异步复位,同步释放。这个较为简单和典型。记住即可。硬复位信号都应该这么产生。

2. 异步复位的实现

敲黑板,面试会考的。 这个不会基本上容易翻车。

always @ (posedge clk, negedge rst_async_n)
if (!rst_async_n) begin
rst_s1 <= 1'b0;
rst_s2 <= 1'b0;
end
else begin
rst_s1 <= 1'b1;
rst_s2 <= rst_s1;
end
assign rst_sync_n = rst_s2;
endmodule

比较简洁。主要原理是用两个寄存器实现的。

image.png

3. 异步复位同步释放的波形显示

这个简单的电路就是这么一个原理~

image.png

4. 子模块的复位顺序

复位顺序需要具体问题具体对待,但总体的原则是
先复位外设,再复位核心。因为核心复位后有可能访问外设。

时钟在数字电路中占据至关重要的地位。是整个数字芯片的节拍器。

image.png

2 ICG模块概述与原理

ICG模块的缩写是integrated Clock Gating的意思, 有些地方把这个东西叫isolate clock gating,应该是不对的。在较为先进的工艺库中一般会直接提供这个模块,不需要自己手动的搭建。但是需要知道其原理。(注:图不想自己画了,所以来自网络)

ICG原理

image.png ICG模块一共有着两种形式,或形式或者与形式。其内部逻辑是用一个寄存器和两个与门组成的。

我们拿与门作为例子来讲。对于与门的ICG,只有clk为低电平也时EN信号才会通过ICG。保证了输出的第一个波形是上升沿。对于或类型的整好相反。可以类似分析。

ICG波形

image.png ICG在数字电路中有三个用途

  • 用于关断时钟,降低功耗
  • 用于动态切换时钟时防止产生毛刺
  • 用于时钟分频,后续讲

3.先回答三个问题

【类型如何选:使用Or还是And ICG,可以自己手动搭建ICG么】

这个比较简单,如果电路是上升沿触发的那么选and ICG,否则选Or ICG。原因是AND ICG第一个好的时钟是时钟上升沿。Or ICG相反。

工艺库都提供,不建议手动搭建。主要原因是分立的搭建需要专门检查STA, 而ICG在库中写好了时序约束,避免很多错误。

【En信号有什么要求】

En不可以异步,En信号一定要同步。否则如果EN和时钟沿离得太近容易亚稳态。

En一定不能是门控后的信号产生的,否则就死循环了。 【ICG是手动加的还是自动加的】

模块级的ICG手动加,寄存器级别的ICG综合工具自动加。后续会讲自动时钟门控。

4.自动门控时钟

ICG模块有时是根据设计手动加入到电路里的,但对于寄存器级别的控制,其实综合工具可以直接帮忙加入。

如下图所示,只要代码风格写的好,综合工具就能自动帮你门控。

image.png

以下所示是如何搭建一个crg的环境 首先是crg_mon.f

image.png crg_mon_defines.svh

image.png crg_mon_if.sv

image.png crg_mon_pkg.sv

image.png crg_mon_config.sv

image.png

image.png 然后是crg_mon.sv

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

具体的验证思路如下: image.png tim1中数据通过tlm通信传递给crg

image.png 接下来看看tim1的interface:

image.png 连接的是cpu下的存储tim1,这些信号都在tim_monitor.sv中被检测出来,然后送到了crg 简单介绍一下tim1的环境 首先是tim_uvc.f

image.png interface的定义tim_if.sv

image.png 包含功能sv的package,tim_pkg.sv

image.png tim_config.sv

image.png tim_transaction.sv

image.png tim_monitor.sv

image.png

image.png

image.png tim_agent.sv

image.png

image.png 在main.c中已经分类好向tim1中写入的数据,这些不同的分类表达着配置了不同的时钟分频,以及检测的开始与结束

image.png

image.png 在top_env_config.sv中配置了理论时钟的频率,这些都用在了crg_mon.sv中

image.png 而在c case中,检测流程如下

image.png