Verilog总是阻止

时间:2012-06-29 18:33:03

标签: verilog

我只想在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[ind‌​ex+2]==1'b0) &&(significand[index+3]==1'b0))
    lzero=lzero+1;
   end
end

这段代码现在确实有意义。我能够得到正确的模拟结果,但我无法在电路板上得到正确的合成。请帮忙

2 个答案:

答案 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更改时,该块都会执行。