刚开始学习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
会不会更好?
答案 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。