用于ALU的Verilog模块但不能正常工作

时间:2016-03-21 04:33:43

标签: verilog iverilog

我正在尝试写下ALU for verilog。 我遇到了一些错误。

首先,这是我的代码:

module yAlu(z, ex, a, b, op);

input [31:0] a, b;
input [2:0] op;
output [31:0] z, ztemp;
output ex; 
wire[31:0]a0,a1,a2,a3,a4, atemp;

assign slt = 0; 
assign ex = 0; 

assign a0 = a & b;
assign a1 = a | b;
assign a2 = a + b;
assign a3 = a - b;
assign a4 = a[31] ^ b[31];

yMux #(32) lo(zLo, a0, a1, op[0]);  
yMux #(32) hi(zHi, a2, a3, op[0]);
yMux #(32) temp(atemp, zLo, zHi, op[1]);
assign z = (op[2] == 1) ? a4 : atemp; 
assign slt = z;

endmodule

yAlu.v使用以下内容:

module yMux(z, a, b, c);
parameter SIZE = 2;
output [SIZE-1:0] z;
input [SIZE-1:0] a, b;
input c;
yMux1 mine[SIZE-1:0](z, a, b, c); // 2-­bit  2 -­to-­1  mux  and  it  would  be  cumbersome  to  write  32  mux  instantiation  lines.
endmodule

最后,yMux使用以下内容:

module yMux1(z, a, b, c);
output z;
input a, b, c;
wire notC, upper, lower;
// Gates and interconnections for MUX

// if c is 0, z=a.
// if c is 1, z=b
not my_not(notC, c);
and upperAnd(upper, a, notC);
and lowerAnd(lower, c, b);
or my_or(z, upper, lower);
endmodule 

以上是yAlu上面测试的内容:

module lab8;

reg [31:0] a, b;
reg [31:0] expect;
reg [2:0] op;
wire ex;
wire [31:0] z;
reg ok, flag;
yAlu mine(z, ex, a, b, op);

initial begin

repeat (10) begin

a = $random; b = $random;

if(op==0)
expect = a & b;
else if (op==1)
expect = a | b;
else if (op==2)
expect = a + b;
else if (op==3)
expect = a - b;
else if (op==4)
expect = (a < b) ? 1 : 0;

#1;

if(expect == z)     
$display("PASS : expected=%d, a=%d, b=%d, z=%d, op=%d", expect,a,b,z,op);

#1;

$finish;  
end 
end
endmodule

我的问题依次如下:

Question 1. 

以上代码仅适用于0和1.它的工作原理不止于此。 例如,在第二个源代码中,有

a = $ random; b = $ random;

它不适用于此。它仅在a = 1或0且b = 1或0时有效。

Question 2. 

我不确定&#34; slt&#34;功能正常。教导这个的教练从来没有告诉过我在演讲中做了什么,但让我们通过谷歌搜索等设计slt。

Question 3. 

每当我编译时,我都会得到以下错误。这是为什么?

    yAlu.v:38: warning: Port 1 (z) of yMux expects 32 bits, got 1.
    yAlu.v:38:        : Padding 31 high bits of the port.
    yAlu.v:39: warning: Port 1 (z) of yMux expects 32 bits, got 1.
    yAlu.v:39:        : Padding 31 high bits of the port.
    yAlu.v:40: warning: Port 2 (a) of yMux expects 32 bits, got 1.
    yAlu.v:40:        : Padding 31 high bits of the port.
    yAlu.v:40: warning: Port 3 (b) of yMux expects 32 bits, got 1.
    yAlu.v:40:        : Padding 31 high bits of the port.

I can't fix this at all.

我甚至不知道我做得对。指导我做它所说的内容的手册没有足够的解释,也没有样本输出。

无论如何我无法及时完成,所以我想这并不重要,但我想我必须知道解决问题的方法。

非常感谢你能帮助我。

1 个答案:

答案 0 :(得分:3)

如警告所示,您的端口连接宽度不匹配。参考单一警告和其他相同的解决方法。

  yAlu.v:38: warning: Port 1 (z) of yMux expects 32 bits, got 1.
    yAlu.v:38:        : Padding 31 high bits of the port.

模块声明端口abcz,每个端口由SIZE参数定义。

module yMux(z, a, b, c);
parameter SIZE = 2;
output [SIZE-1:0] z;
input [SIZE-1:0] a, b;

此外,SIZE在实例化时被覆盖。现在,SIZE的值为32.因此abcz的每个的宽度为的 32位

yMux #(32) lo(zLo, a0, a1, op[0]);  
yMux #(32) hi(zHi, a2, a3, op[0]);
yMux #(32) temp(atemp, zLo, zHi, op[1]);

此处,端口zLozHi在端口连接中未声明直接使用

参考IEEE 1800-2012,第6.10节 - 隐含声明:

  

如果在端口表达式声明中使用了标识符,那么   应使用向量假设隐含净违约净类型   端口表达式声明的宽度。

如果未声明的标识符用作实例的连接,则会推断出隐式网络

因此,zLozHi 隐式声明为单位其余32位 用零填充。只需声明如下,所有警告删除

wire [31:0] zLo,zHi;

要在这种情况下获得错误,请使用default_nettype none编译器指令。

有关详细信息,请参阅Sutherland SV Gotchas论文,第2.2节和SystemVerilog IEEE 1800-2012以获取隐式声明。