在verilog中#1意味着什么?

时间:2014-03-05 11:30:50

标签: verilog

我知道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;

2 个答案:

答案 0 :(得分:2)

#1延迟1次。要查找您使用的时间步骤,您可以使用:

$printtimescale;

> Time scale of (test) is  1ns /  1ns

仅使用#1可能会有风险,因为它基于`timescale 10ns/1fs的最后一个实例。

因此,随着文件的添加或加载顺序的更改,#1的定义可能会发生变化。较新版本的Verilog支持使用单位#1ns1ns部分是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