我只想在verilog中使用一些if else语句。 所以我必须使用always block。
integer count,index;
reg a=0;
always@(a) begin
a=1;
for(count=0;count<7;count=count+1) begin
index=4*count;
if((significand[index]==1'b0)&&(significand[index+1]==1'b0)&&
(significand[index+2]==1'b0) &&(significand[index+3]==1'b0))
lzero=lzero+1;
end
end
这段代码现在确实有意义。我能够得到正确的模拟结果,但我无法在电路板上得到正确的合成。请帮忙
答案 0 :(得分:4)
这是一个非常典型的问题,知道如何使用C或C ++编程,但忘记Verilog和VHDL与那些不同。
ALWAYS 块内的每个Verilog代码信号行同时被“执行”。 ALWAYS块外部的组合逻辑也是如此。
在您的代码中,
assign a=1'b1;
assign a=1'b0;
无论如何都会同时发生。
改变它的唯一方法是在for循环的结束语句之后将最后一行放在always块中。
有一页可以帮助您理解C和Verilog之间的区别:EE-Times: The C Programmers Guide to Verilog
答案 1 :(得分:2)
assign 1'b1;
和assign 1'b0;
都不是有效的作业。如果你想用1'b1
不断开网,那么你必须写assign myvar = 1'b1;
之类的内容。
此外,如果您的意图是实际分配给a
,那么始终阻塞没有意义,因为a
是其敏感性列表中的唯一内容,这意味着必须在{{{}} { {1}}更改其值。由于a
基本上不会更改其值,因此永远不应执行该块。
除非您提供一个演示问题的最小工作示例,否则很难帮助您。我唯一可以推荐的是在a
右侧声明中使用ternary operator。这样,您可以在不使用assign
块的情况下对行为逻辑进行建模。例如:
always
希望它有所帮助。
<强>更新强>
您的第二个代码示例既不完整也不合法。您不能为同一个网络进行两次组合分配。
但是,always块中的灵敏度列表现在是一个星形,Verilog 2001表示法将所有右侧操作数自动包含在灵敏度列表中。在您的情况下,每次assign a = (b == 1'b1 ? c : 1'b0);
或significand
更改时,该块都会执行。