了解具有两个时钟的 Verilog 代码
Understanding Verilog Code with two Clocks
我是 Verilog 的新手
我用它来验证模拟程序中的一些代码。
现在我正在努力是否使用 verilog 代码片段,因为模拟程序使用 2 个时钟(一个系统时钟和一个 pll),其中两个硬件组件一起工作,从而相互同步:
module something (input data)
reg vid;
always @(posegde sys_clk)
vid <= data;
always @(posegde pll_clk)
if (vid)
// do something
在阅读非阻塞分配时,它说左侧的评估被推迟,直到当前时间步中的其他评估完成。
直观我认为这意味着它们在时间步长结束时被评估,因此如果数据在 sys_clk 中从 0 变为 1 勾选“A”,这意味着在“A”结束时并且下一个 sys_clk 的开始 tick 此值在 vid 中,因此只有在“A”之后第二个始终块(pll_clk)才能读取 vid = 1
这是它的工作原理还是我错过了什么?
谢谢:)
在这种特殊情况下,这意味着
- 如果posedge sys_clk和pll_clk同时发生那么vid 在 pll_clk 块中使用之前将没有机会更新。因此,如果 vid 在时钟沿之前为“0”(并在第一个块中更新为“1”),它在第二个块的 if 语句中仍为“0”堵塞。这个序列是通过在第一个块
中使用non-blocking赋值来保证的
- 如果 posedges 没有同时发生,那么 vid 的值将在 posedge sys_clk 更新并稍后在以下 posedge of pll_clk.
在模拟中,non-blocking 赋值保证赋值本身发生之后 所有块都在当前时钟节拍中被评估。它与下一个时钟周期无关。但是,后者经常在教程中用于说明特定的 single-clock 情况,造成混淆。
同时也是一种模拟抽象,这意味着两个边沿都发生在同一个时钟滴答中(或者在硬件中的某个小时间间隔内)。
我是 Verilog 的新手 我用它来验证模拟程序中的一些代码。 现在我正在努力是否使用 verilog 代码片段,因为模拟程序使用 2 个时钟(一个系统时钟和一个 pll),其中两个硬件组件一起工作,从而相互同步:
module something (input data)
reg vid;
always @(posegde sys_clk)
vid <= data;
always @(posegde pll_clk)
if (vid)
// do something
在阅读非阻塞分配时,它说左侧的评估被推迟,直到当前时间步中的其他评估完成。
直观我认为这意味着它们在时间步长结束时被评估,因此如果数据在 sys_clk 中从 0 变为 1 勾选“A”,这意味着在“A”结束时并且下一个 sys_clk 的开始 tick 此值在 vid 中,因此只有在“A”之后第二个始终块(pll_clk)才能读取 vid = 1
这是它的工作原理还是我错过了什么?
谢谢:)
在这种特殊情况下,这意味着
- 如果posedge sys_clk和pll_clk同时发生那么vid 在 pll_clk 块中使用之前将没有机会更新。因此,如果 vid 在时钟沿之前为“0”(并在第一个块中更新为“1”),它在第二个块的 if 语句中仍为“0”堵塞。这个序列是通过在第一个块 中使用non-blocking赋值来保证的
- 如果 posedges 没有同时发生,那么 vid 的值将在 posedge sys_clk 更新并稍后在以下 posedge of pll_clk.
在模拟中,non-blocking 赋值保证赋值本身发生之后 所有块都在当前时钟节拍中被评估。它与下一个时钟周期无关。但是,后者经常在教程中用于说明特定的 single-clock 情况,造成混淆。
同时也是一种模拟抽象,这意味着两个边沿都发生在同一个时钟滴答中(或者在硬件中的某个小时间间隔内)。