我正在尝试写下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.
我甚至不知道我做得对。指导我做它所说的内容的手册没有足够的解释,也没有样本输出。
无论如何我无法及时完成,所以我想这并不重要,但我想我必须知道解决问题的方法。
非常感谢你能帮助我。
答案 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.
模块声明端口a
,b
,c
和z
,每个端口由SIZE
参数定义。
module yMux(z, a, b, c);
parameter SIZE = 2;
output [SIZE-1:0] z;
input [SIZE-1:0] a, b;
此外,SIZE
在实例化时被覆盖。现在,SIZE
的值为32.因此a
,b
,c
和z
的每个的宽度为的 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]);
此处,端口zLo
,zHi
在端口连接中未声明且直接使用。
参考IEEE 1800-2012,第6.10节 - 隐含声明:
如果在端口表达式声明中使用了标识符,那么 应使用向量假设隐含净违约净类型 端口表达式声明的宽度。
如果未声明的标识符用作实例的连接,则会推断出隐式网络。
因此,zLo
,zHi
隐式声明为单位网,其余32位 用零填充。只需声明如下,所有警告将删除:
wire [31:0] zLo,zHi;
要在这种情况下获得错误,请使用default_nettype none
编译器指令。
有关详细信息,请参阅Sutherland SV Gotchas论文,第2.2节和SystemVerilog IEEE 1800-2012以获取隐式声明。