[英]When shall I use the keyword “assign” in SystemVerilog?
例如,如果我不使用assign
关键字,这里会发生什么:
module dff(q,d,clear,preset,clock);
output q;
input d, clear, preset, clock;
logic q;
always @(clear or preset)
if (!clear)
assign q = 0;
else if (!preset)
assign q = 1;
else
deassign q;
always @(posedge clock)
q = d;
endmodule
可合成的 Verilog 代码的一般准则是,您应该只将assign
关键字用于组合逻辑,而不是像 DFF 这样的顺序逻辑。
您的代码示例来自 IEEE Std 1800-2017, section 10.6.1 The assign and deassign procedural statements 。 这种编码风格虽然合法,但不推荐用于合成 DFF。 事实上,就在代码下面是这样的语句:
注意——程序分配和解除分配结构正在考虑弃用。
本质上,您不应该在always
块中使用assign
。
可合成 DFF(只有异步复位)的更传统代码是:
module dff (
output logic q,
input d, resetn, clock
);
always @(posedge clock or negedge resetn) begin
if (!resetn) begin
q <= 0;
end else begin
q <= d;
end
end
endmodule
不需要assign
,它使用非阻塞 ( <=
) 分配。
如果您在发布的示例中未使用assign
关键字,则q
将在下一个posedge clock
上写入d
的值。 clear
或preset
的 state 对q
的值没有持久影响。 正常的程序分配被程序连续分配覆盖。
将时序逻辑的同步和异步行为划分为单独的always
块的综合风格在综合工具中不受欢迎,并逐渐失去了所有支持。 它与请求仅从单个always
块写入变量的样式冲突。 此外,人们对连续分配和程序连续分配感到困惑,因为它们都使用了assign
关键字。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.