我有一些verilog代码,在这些代码中,我使用了一个变量“逻辑1:0 internalSaveSense =2‘b00”,这里我使用阻塞赋值,而在其他一些过程中,我对相同的变量"internalSaveSense <= 1'b0;“使用非阻塞赋值。这是给我一个警告“阻塞和非阻塞分配在不同的进程”,我如何解决这个问题?
供参考的代码:
module someModuleName(in, out, qsave, save, restore);
input in;
output out;
output reg qsave = 1'b0;
input reg save;
input reg restore;
always@(save) begin
if(save == 1'b1)
qsave <= out;
end
assign out = (restore == 1'b1) ? qsave : in;
endmodule 我收到的警告信息是:
Warning-[SM_BNDP] Blocking and Non Blocking Assignments in different Processes
Found blocking and non-blocking assignments for signal 'qsave'.我尝试将阻塞分配更改为(qsave= 1'b0 )为非阻塞分配(qsave <= 1'b0),但它引发了语法错误:
Error-[SE] Syntax error
Following verilog source has syntax error :
2138: token is '<='
output reg qsave <= 1'b0;我刚接触verilog,不知道如何解决这个警告。任何帮助都将不胜感激。谢谢。
发布于 2021-12-28 10:10:07
用output reg qsave = 1'b0;替换output reg qsave;
另外,下面的always块将被推断为闩锁。添加一个else或default条件以避免它。
always@(save) begin
if(save == 1'b1)
qsave <= out;
end发布于 2021-12-29 14:24:40
在一种可综合的Verilog码中,通常使用具有非边缘或嵌套灵敏度列表的块来制作组合电路。因此,如果您的目标是编写可合成的代码,请在组合块中使用阻塞赋值:
module someModuleName(in, out, qsave, save, restore);
input in;
output out;
output reg qsave = 1'b0;
input reg save;
input reg restore;
//combinational block
always@(save) begin
if(save == 1'b1)
qsave = out;
end
assign out = (restore == 1'b1) ? qsave : in;
endmodulehttps://stackoverflow.com/questions/70504831
复制相似问题