【问题标题】:How does system verilog treat if statements in always_ff blocks系统verilog如何处理always_ff块中的if语句
【发布时间】:2019-12-06 04:59:11
【问题描述】:
always_ff @(posedge sysclk) begin
case(state) begin
SOME_STATE begin
if(some logic to check) begin
variable1 <= 1;
variable2 <= variable_a > 0 ? 0 : 1;
end
else begin
variable1 <= variable_b > 0 ? 0 : 1;
variable2 <= 1;
end
variable3 <= {variable1, variable2};
end //this case
endcase
end //always_ff
所有变量都是逻辑类型并且大小合适。
系统 verilog 会在将控制 var1 和 2 的语句分配给 var3 之前正确评估它们,还是将 always_ff 中的 if 语句视为非阻塞?为了清楚起见,还有更多其他 if 已被删除。
【问题讨论】:
标签:
fpga
system-verilog
intel-fpga
【解决方案1】:
always_ff 块内的非阻塞赋值会推断触发器。 if 声明无关紧要。因此,在您的示例代码中,variable1、variable2 和 variable3 在模拟中的行为都类似于触发器,因此在综合后将成为触发器。
如果您希望variable1 和variable2 成为组合逻辑,那么您必须使用阻塞赋值:
always_ff @(posedge sysclk) begin
case(state) begin
SOME_STATE begin
if(some logic to check) begin
variable1 = 1; // <-----
variable2 = variable_a > 0 ? 0 : 1; // <-----
end
else begin
variable1 = variable_b > 0 ? 0 : 1; // <-----
variable2 = 1; // <-----
end
variable3 <= {variable1, variable2};
end //this case
endcase
end //always_ff
如果你想要这个,那么我建议你在begin-end 块内声明variable1 和variable2:
always_ff @(posedge sysclk) begin
<some type> variable1; // <-----
<some type> variable2; // <-----
case(state) begin
...
variable3 <= {variable1, variable2};
end //this case
endcase
end //always_ff
这将阻止任何其他always 块能够看到这些变量,这将阻止潜在的模拟竞赛,如果其他一些always 块可以看到它们。 p>
【解决方案2】:
IF 语句将代表布尔逻辑,它将值驱动到您的触发器。
我宁愿拆分always_comb进程中的组合逻辑和always_ff中的顺序逻辑。
always_ff @(posedge sysclk) begin
if (something)
variable1 <= value; // Non Blocking assignment in always_ff block, variable 1 will be a Flip-Flop
end //always_ff
always_comb begin
if (something)
variable2 = value; // Non Blocking assignment in always_comb block, variable2 won't be a flop in this case, but just a combinatinal logic.
end //always_comb
您的 IF 语句将推断相同的逻辑,在 always_ff 和 always_comb 块中,推断的逻辑将作为将值加载到变量 1 的启用。
我希望它能澄清你在问什么。