Verilog中#能被综合么,综合后有什么含义么?always@(posedge clk or negedge nReset)if nReset)beginRESETn 还有ud_cnt #(SIZE,ID) cnt (.clk(clk),....

来源:学生作业帮助网 编辑:作业帮 时间:2024/05/09 06:44:30
Verilog中#能被综合么,综合后有什么含义么?always@(posedge clk or negedge nReset)if nReset)beginRESETn 还有ud_cnt #(SIZE,ID) cnt (.clk(clk),....

Verilog中#能被综合么,综合后有什么含义么?always@(posedge clk or negedge nReset)if nReset)beginRESETn 还有ud_cnt #(SIZE,ID) cnt (.clk(clk),....
Verilog中#能被综合么,综合后有什么含义么?
always@(posedge clk or negedge nReset)
if nReset)
begin
RESETn
还有ud_cnt #(SIZE,ID) cnt (.clk(clk),....

Verilog中#能被综合么,综合后有什么含义么?always@(posedge clk or negedge nReset)if nReset)beginRESETn 还有ud_cnt #(SIZE,ID) cnt (.clk(clk),....
不能综合,被忽略 了.

为求全面完整,叙述比较长,希望你能耐心看完,起码我都耐心打完了,呵呵~
先扼要答题:
(1)#1是延时语句,不能被综合,只能用于仿真。
至于延时多少则取决于你所定义的时钟,例如:
assign #1 A_xor_wire = eq0 ^ eq1; // `timescale 1ns/100ps
就表示该异或门延时为1ns,也就是说从输入端信号变化到输出端体...

全部展开

为求全面完整,叙述比较长,希望你能耐心看完,起码我都耐心打完了,呵呵~
先扼要答题:
(1)#1是延时语句,不能被综合,只能用于仿真。
至于延时多少则取决于你所定义的时钟,例如:
assign #1 A_xor_wire = eq0 ^ eq1; // `timescale 1ns/100ps
就表示该异或门延时为1ns,也就是说从输入端信号变化到输出端体现变化需要1ns的时间。(其中1ns表示延时单位,100ps表示时间精度,即编译器所能接受的最小仿真时间粒度。 )
(2)ud_cnt #(SIZE, ID) cnt (.clk(clk),....) 是带参数值的模块引用,模块实例语句自身包含有新的参数值。你没有贴出完整代码,我还是抄书上例子给你讲,例如:

HA #(5,2) Hal(New, NewB, NewC);
//第1个值5赋给参数AND_DELAY,该参数在模块HA中说明。
//第2个值5赋给参数XOR_DELAY,该参数在模块HA中说明。

module HA(A,B,S,C);
input A,B;
output S,C;
parameter AND_DELAY =1, XOR_DELAY =2;
assign #XOR_DELAY S = A^B;
assign #AND_DELAY C=A&B;
endmodule

//模块实例语句
HA h2 (.A(Cin), .S(Sum), .B(S1), .C(C2)); //通过端口与信号的名字关联

仔细对比看看,想想,我想你应该明白了吧?
再扩展深化:
实际上,电路对不同的信号跳变表现出的延时往往并不一致,这些延时模型包括上升沿延时(输出变为1)、下降沿延时(输出变为0)、关闭延时(输出变成Z,高阻态)和输出变成X的延时。比如:
assign #(1,2) A_xor_wire = eq0 ^ eq1;
assign #(1,2,3) A_xor_wire = eq0 ^ eq1;
第一句表示上升延时为1ns,下降延时为2ns,关闭延时和传递到X的延时取两者中最小的,即1ns。
第二句表示上升延时为1ns,下降延时为2ns,关闭延时为3ns,传递到X的延时取1、2、3中最小的,即1ns。
在一些电路模型中,延时分为最大、典型和最小3种情况。连续赋值语句中的延时也可以采用min:typ:max的格式来表示,如:
assign #(4:5:6, 3:4:5) A_xor_wire = eq0 ^eq1;
表示上升延时的min:typ:max为4:5:6,下降延时的min:typ:max为3:4:5。
你代码中类似“RESETn <= #1 1'b0;”的语句属于“在非阻塞赋值语句的右式(RHS)中增加延时”,可以精确的模拟电路中的传导延时,是一种有意义的、健康的代码风格。以
always (a or b) begin
SUM <= #5 a+b
end
为例,其执行过程是这样的:
首先计算a+b的值,然后将“相加结果赋予sum”的更新事件调度到T+5ns以后执行,此后,a和b上的任何变化都将导致always的再次执行,也就是说a和b上的任何变化都不会被忽略,而总是在5ns以后体现在SUM上。
此外,不推荐在阻塞赋值语句中增加延时(#5 SUM=a+b; 和 SUM = #5 a+b;),也不推荐在非阻塞语句的左式中增加延时(#5 SUM <= a+b;)。详见《设计与验证:Verilog HDL》的8.5.4节。
而在连续赋值语句中,只有一种延时语法是合法的,如下:
assign #5 B=~A;
这种延时精确地模拟了电路中的惯性延时。A信号上任何小于5ns的变化都将被过滤掉,而不会反映到B信号上。

收起

# 是用来模拟电路延迟的。因为在RTL仿真的时候,如果没有#的延迟,信号的变化是瞬间就完成的,没有任何可以测量到的延迟。我们知道,实际电路是会有延迟的。有人会采用#延迟在RTL里模拟这样的电路延迟。这样的延迟是设计人员手工设置的。一旦进行综合,这样的延迟是没有对应的电路单元。也就是说,在综合中没有任何意义。
ud_cnt #(SIZE, ID) cnt (.clk(clk),....) 是...

全部展开

# 是用来模拟电路延迟的。因为在RTL仿真的时候,如果没有#的延迟,信号的变化是瞬间就完成的,没有任何可以测量到的延迟。我们知道,实际电路是会有延迟的。有人会采用#延迟在RTL里模拟这样的电路延迟。这样的延迟是设计人员手工设置的。一旦进行综合,这样的延迟是没有对应的电路单元。也就是说,在综合中没有任何意义。
ud_cnt #(SIZE, ID) cnt (.clk(clk),....) 是实例化一个module。module的名字是ud_cnt。该module定义了两个parameter。在实例化的时候,#(SIZE,ID), 分别用SIZE和ID来从新设定这两个parameter。.clk(clk)等等就是普通的端口映射。

收起

对于第一个问题,是延时语句,verilog语句在综合的时候,综合工具会自动忽略的。
对于第二个语句,是将参数传递的过程,将参数传递给parameter