我知道verilog中的always @(posedge clk)
是一个触发器。
input ld;
reg ld_r;
always @(posedge clk) ld_r <= #1 ld;
#1
在上面的代码中做了什么?我在AES的verilog代码中找到了它。我在下面添加了一段代码:
always @(posedge clk)
if(!rst) dcnt <= #1 4'h0;
else
if(ld) dcnt <= #1 4'hb;
else
if(|dcnt) dcnt <= #1 dcnt - 4'h1;
always @(posedge clk) done <= #1 !(|dcnt[3:1]) & dcnt[0] & !ld;
always @(posedge clk) if(ld) text_in_r <= #1 text_in;
always @(posedge clk) ld_r <= #1 ld;
答案 0 :(得分:2)
#1
延迟1次。要查找您使用的时间步骤,您可以使用:
$printtimescale;
> Time scale of (test) is 1ns / 1ns
仅使用#1
可能会有风险,因为它基于`timescale 10ns/1fs
的最后一个实例。
因此,随着文件的添加或加载顺序的更改,#1
的定义可能会发生变化。较新版本的Verilog支持使用单位#1ns
。 1ns
部分是realtime
,您可以像对待任何realtime
变量一样对它们执行操作。
//Delay 1001ns
#(1us + 1ns);
内部分配
ld_r <= #1 ld;
等同于:
temp = ld;
#1 ld_r <= temp; // Delay execution of ld_r <= temp by 1 timestep
这需要复制ld 现在并将其值分配回#1
中的ld_r。
9.4.5 Intra-assignment timing controls of SystemVerilog IEEE 1800-2012 Standard:
中解释了这种情况的用法答案 1 :(得分:2)
既然你提到always @(posedge clk)
推断了一个触发器,我假设你有兴趣知道在硬件中合成#1
。答案是:什么都没有。
这些延迟在综合中会被忽略,因此如果您在设计代码中使用它们,则存在模拟与您的硬件不匹配的风险。
以下是一篇文章,介绍了您希望添加延迟的原因:http://sunburst-design.com/papers/CummingsSNUG2002Boston_NBAwithDelays.pdf