【问题标题】:Continuous assignment verilog连续赋值verilog
【发布时间】:2014-04-21 18:37:23
【问题描述】:

-此代码是使用 Modelsim 10.2d 以 verilog 编写的。以下错误表明 {cout,l3} 分配存在一些问题。

module alu(a,b,bin,cin,op,cout,res);
input [31:0] a,b;
input [1:0] op;
input bin,cin;
reg [31:0] l1,l2,l3;
output cout;
output [31:0] res;

assign l1 = a & b;
assign l2 = a | b;

initial
if(bin == 1'b0)
  assign {cout,l3} = a + b + cin;
else
  assign {cout,l3} = a - b + cin;

mux4to1(l1,l2,l3,op,res);
endmodule

Error-
v(14): LHS in procedural continuous assignment may not be a net: cout.
v(16): LHS in procedural continuous assignment may not be a net: cout.

【问题讨论】:

    标签: variable-assignment verilog system-verilog alu


    【解决方案1】:

    wire 不能在 initialalways 块内分配。您应该将类​​型更改为reg

    初始块只会在模拟开始时运行一次,不会持续评估,因此您应该改用always

    //...
    output reg cout;
    //...
    
    always @* begin
      if(bin == 1'b0) begin
        {cout,l3} = a + b + cin;
      end
      else begin
        {cout,l3} = a - b + cin;
      end
    end
    

    【讨论】:

      【解决方案2】:

      您的代码中还会有一些问题。 1.

      assign l1 = a & b;
      assign l2 = a | b;
      

      连续赋值的主要规则是 LHS 必须是一个网络。这条规则的原因是寄存器在离散时间获取值,但网络总是由值驱动。对网络的更改可能会异步发生。

      2.代码中的错误

      你可以在always块内赋值(准连续赋值),但LHS必须是寄存器。这是verilog中的高级功能,我强烈建议你不要使用它。为了简单,不要在一个 always 块,块中的所有分配都应该是寄存器(即 Lhs)

      更改您的代码

      wire[31:0] l1,l2;
      

      ...

      if(bin == 1'b0)
         {cout,l3} = a + b + cin;
      else
         {cout,l3} = a - b + cin;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-05-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-26
        相关资源
        最近更新 更多