繁体   English   中英

我什么时候应该在 SystemVerilog 中使用关键字“assign”?

[英]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的值。 clearpreset的 state 对q的值没有持久影响。 正常的程序分配被程序连续分配覆盖。

将时序逻辑的同步和异步行为划分为单独的always块的综合风格在综合工具中不受欢迎,并逐渐失去了所有支持。 它与请求仅从单个always块写入变量的样式冲突。 此外,人们对连续分配程序连续分配感到困惑,因为它们都使用了assign关键字。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM