【问题标题】:System Verilog always_latch vs. always_ff系统 Verilog always_latch 与 always_ff
【发布时间】:2015-07-01 15:25:47
【问题描述】:

刚开始学习 System Verilog。我对语句always_ffalways_latch 的用法感到困惑。 前者将用作:

always_ff @ (posedge clk)
begin
    a <= b;
end

而后者:

always_latch
begin
    a <= b;
end

第一个仅由时钟的上升沿激活,并与非阻塞分配相结合产生 FF。

always_latch 显然被认为代表一个锁存器,但是为什么要使用非阻塞赋值呢? 使用带有阻塞分配的always_comb 不是更好吗?

【问题讨论】:

    标签: system-verilog vlsi register-transfer-level


    【解决方案1】:

    通过使用 always_latch 或 always_ff,设计人员打算分别推断锁存器或时序逻辑,但如果逻辑不正确,软件工具可以警告设计人员预期的硬件逻辑未正确推断。

    例如:

    always_ff @ (posedge clk or negedge rst) 
    begin
      if (!rst)
        a <= '0;
    end
    

    对于上面的代码,设计者打算只得到一个时序逻辑而不是一个锁存器,但实际上会生成一个锁存器(任何静态工具都会生成一个警告消息“将为逻辑推断锁存器”)

    对于下面的代码,设计人员的意图是推断硬件锁存器,因此工具将(更好地理解您的逻辑)并且不会报告它。

        always_latch
        begin
          if (rst)
            a <= b;
        end
    

    锁存器是一种时序逻辑,它作用于时钟电平而不是时钟边沿。

    一般来说,最佳实践是对顺序逻辑使用非阻塞赋值,对组合逻辑使用阻塞赋值,这在第 5.0 节中有详细说明 Nonblocking Assignments in Verilog Synthesis, Coding Styles That Kill!的Verilog编码指南

    准则 #2:在为锁存器建模时,使用非阻塞分配。

    【讨论】:

    • 我已经修改了 always_ff 块,你是对的,但现在它会推断“a”的锁存器,而不管输入绑定到低电平
    【解决方案2】:

    来自IEEE Std 1800-2012,“9.2.2.3 锁存逻辑 always_latch 过程”部分:

    always_latch 结构与 always_comb 结构相同 除了软件工具应该执行额外的检查和警告 如果 always_latch 构造中的行为不代表 锁存逻辑,而在 always_comb 构造中,工具应检查 并在行为不代表组合逻辑时发出警告。

    Std 中的代码示例显示了使用非阻塞赋值的 always_latch。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-14
      相关资源
      最近更新 更多