0

我只想在verilog中使用一些if else语句。所以我必须使用总是阻止。

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

这段代码现在确实有些意义。我能够得到正确的仿真结果,但我未能在板上得到正确的合成。请帮忙

4

2 回答 2

4

对于知道如何使用 C 或 C++ 编程但忘记 Verilog 和 VHDL 与那些不同的人来说,这是一个非常典型的问题。

ALWAYS块内的 Verilog 代码的每条信号线都同时“执行”。ALWAYS 块之外的组合逻辑也是如此。

在您的代码中,

assign a=1'b1;

assign a=1'b0;

无论如何都会同时发生。

改变这一点的唯一方法是将最后一行放在你的 always 块中,在 for 循环的 end 语句之后。

可以帮助您了解 C 和 Verilog 之间区别的一页是以下页面:EE-Times: The C Programmers Guide to Verilog

于 2012-06-30T18:01:36.687 回答
2

既不assign 1'b1;是也不assign 1'b0;是有效的分配。如果你想不断地驱动一些网络1'b1,那么你必须写一些类似的东西assign myvar = 1'b1;

此外,如果您的意图是实际分配给a,那么 always block 没有意义,因为a它是其敏感性列表中唯一的东西,这意味着该块必须在a更改其值时执行。由于a本质上永远不会改变它的值,所以这个块永远不应该被执行。

除非您提供一个最小的工作示例来证明您的问题,否则很难帮助您。我唯一可以推荐的是在右手边的语句中使用三元运算符。assign这样您就可以在不使用always块的情况下对行为逻辑进行建模。例如:

assign a = (b == 1'b1 ? c : 1'b0); 

希望能帮助到你。

更新:

您的第二个代码示例既不完整也不合法。同一个网络不能有两个组合分配。

但是,always 块中的敏感度列表现在是一个星号,这是 Verilog 2001 表示法,用于将所有右侧操作数自动包含到敏感度列表中。在您的情况下,该块将在每次significandlzero更改时执行。

于 2012-06-29T18:40:56.073 回答