System Verilog always_latch vs. always_ff

时间:2015-07-01 15:25:48

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

刚开始学习System Verilog。我对语句#version 400 core in vec3 position; in vec2 textureCoords; in int selected; out vec3 colour; out vec2 pass_textureCoords; uniform mat4 transformationMatrix; uniform mat4 projectionMatrix; uniform mat4 viewMatrix; void main(void){ gl_Position = projectionMatrix * viewMatrix * transformationMatrix * vec4(position, 1.0); pass_textureCoords = textureCoords; if(selected == 1){ colour = vec3(200, 200, 200); } else{ colour = vec3(0, 0, 0); } gl_BackColor = vec4(colour, 1.0); } always_ff的使用感到困惑。 前者将用作:

always_latch

而后者:

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

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

always_latch begin a <= b; end 显然被认为代表了一个锁存器,但为什么要使用非阻塞分配呢? 使用阻止分配的always_latch会不会更好?

2 个答案:

答案 0 :(得分:4)

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

例如:

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

对于上面的代码,设计者只想获得一个顺序逻辑而不是一个锁存器,但实际上会产生一个锁存器(任何静态工具都会产生一条警告信息,因为“将为逻辑推断Latch”)

类似于下面的代码,设计者的意图是推断硬件锁存器,以便工具(更好地理解你的逻辑)并且不会报告它。

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

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

一般来说,最佳做法是对序列逻辑使用非阻塞分配,并对组合逻辑使用阻塞分配,详见第5.0节 Verilog编码指南Nonblocking Assignments in Verilog Synthesis, Coding Styles That Kill!

  

指南#2:对锁存器建模时,请使用非阻塞指定。

答案 1 :(得分:2)

IEEE Std 1800-2012开始,“9.2.2.3锁存逻辑always_latch程序”部分:

  

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

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