我设计了一个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
答案 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按名称分配参数值"。