如何在verilog中更改参数的值

时间:2014-12-20 15:45:24

标签: verilog hdl

我设计了一个ALU,它执行4次操作取决于操作码的值,并且我使用生成条件调用子模块,我必须根据项目规范。但我如何将参数的值更改为从一个操作转移到另一个操作?

这里是代码:

module ALU (A4, B4,cin4);
input [7:0] A4, B4;
input  cin4;
//input [1:0] opc; 
wire [7:0]out4;
wire cout4;
parameter opc=0;
generate     
    case (opc) 
        0: alu_add  u1(out4,cout4,A4,B4,cin4); //calling an alu_add module   
        1: alu_sub  u2(out4,cout4,A4,B4,cin4);
        2: alu_comp  u3_1(B4,out4); 
        3: alu_xor  u4 (A4,B4,out4);
    endcase 
endgenerate 

2 个答案:

答案 0 :(得分:1)

参数用于常量,因此在模拟期间无法更改。在实例化期间可以覆盖参数。

我担心的是在问题中使用call这个词。 Generates用于根据常量生成硬件,即它们不会动态创建和销毁硬件。

u1到u4是描述物理硬件的实例,你当时写的是一个只能做一件事的ALU。代码是可配置的,并且用户可以选择4件事,但一旦实例化,它就会被修复。

要制作具有所有四种操作可用操作的通用通用ALU,您需要从所需的ALU中选择输出,即:

module ALU (
  input [7:0] A4, 
  input [7:0] B4,
  input  cin4,
  input [1:0] opc; 
);

wire [7:0]out4, out4_0, out4_1, out4_2, out4_3;
wire cout4 ,cout4_0, cout4_1;

alu_add  u1(out4_0,cout4_0,A4,B4,cin4); //calling an alu_add module  
alu_sub  u2(out4_1,cout4_1,A4,B4,cin4);
alu_comp  u3_1(B4,out4_2); 
alu_xor  u4 (A4,B4,out4_3);

  always @* begin  
    case (opc) 
      0: out4  = out4_0; 
      1: out4 = out4_1;
      2: out4 = out4_2;
      3: out4 = out4_3;
    endcase 
    case (opc)
      0: cout4 = cout4_0;
      1: cout4 = cout4_1;
      default:  cout4 = 'b0;
    endcase
  end
endmodule

答案 1 :(得分:0)

您可以在实例化模块时覆盖参数的值。例如:

ALU #(.opc(1)) i1 ();
ALU #(.opc(2)) i2 ();

参考IEEE Std 1800-2012,Section" 23.10.2.2按名称分配参数值"。