Verilog 中的 ALU:"Unable to bind wire/reg/memory"
ALU in Verilog: "Unable to bind wire/reg/memory"
我正在尝试制作一个带有溢出标志的简单 32 位 ALU,然后将 ALU 的输入和结果输出到屏幕,但我在连接测试台的元件时遇到了一些问题。我收到此错误:
test_32bALU.v:15: error: Wrong number of ports. Expecting 4, got 5.
test_32bALU.v:33: error: Unable to bind wire/reg/memory
test_unit.overflow' in
alu_test'
2 error(s) during elaboration.
我刚刚开始使用 Verilog,我对语法有一个基本的了解。我知道我不应该问调试问题,但这是我唯一的希望。我的教授或助教不会回应我的帮助请求。如果有人能帮我指出我的错误,我将不胜感激。
这是我的 32bALU.v 文件:
module alu(
input signed[31:0] a,b,
input[3:0] opcode;
output signed[31:0] c;
output overflow;
);
reg signed[31:0] result;
assign c = result;
reg tmp;
parameter
add = 4'b0000,
sub = 4'b0110,
sla = 4'b0001,
srai = 4'b0011;
always @(a,b,opcode)
begin
case(opcode)
add:
begin
c = a + b;
end
endcase
end
always @(c)
begin
if (c[32:31] == (2'b11 | 2'b10)) // Overflow
begin
tmp = 1'b1;
assign overflow = tmp;
end
else begin
tmp = 1'b0;
assign overflow = tmp;
end
end
assign result = c[31:0];
endmodule
test_32bALU.v
`timescale 1ns/1ps
module alu_test;
// Inputs
reg[31:0] a,b;
reg[2:0] opcode;
// Outputs
wire[31:0] c;
//wire [1:0] zero;
wire [1:0] overflow;
//wire [1:0] neg;
alu test_unit(
a,b, // Inputs
opcode,
c,
overflow
);
parameter
add = 4'b0000,
sub = 4'b0110,
sla = 4'b0001,
srai = 4'b0011;
initial begin
$display("op: a : b : c : reg_A : reg_B : reg_C");
$monitor(" %h:%h:%h:%h:%h:%h:%h",
opcode, a, b, c, test_unit.a, test_unit.b, test_unit.c);
$monitor("%h", test_unit.overflow);
//// add
#10 a=32'b0000_0000_0000_0000_0000_0000_0000_0001;
#10 b=32'b0000_0000_0000_0000_0000_0000_0000_0001;
opcode= add;//3'b000
#10 $finish;
end
endmodule
我很困惑为什么它说 "wrong number of ports"?我假设它是 module alu
和 alu test_unit
中的参数数量?它们具有相同数量的参数(a、b、c、操作码和溢出),那么我到底缺少什么?我究竟如何获得 overflow
的值?在我添加 overflow
参数之前它工作正常,所以我假设我做错了吗?
对于第二个错误,我在这里的某个地方读到它可能是由于缺少声明,但我已经声明了所有这些......所以我不确定是什么导致了错误。
我不确定这是否是问题所在,但您的模块定义不正确。应该是这样的:
module alu(
input signed[31:0] a,b,
input[3:0] opcode,
output signed[31:0] c,
output overflow
);
也许这对您的问题有帮助。
在模块声明中用逗号分隔输入和输出。
永远不要依赖模块参数的顺序,并且始终尝试使用名为 A 的模块;
module A(output wire c,
input wire a,
input wire b);
...
endmodule // A
使用它的实例;
A yourAname(.c(Bar),
.a(Foo1),
.b(Foo2));
这样,如果模块 I/O 的定义和顺序发生变化,此实例化将跟踪这些变化 and/or 在 simulated/synethesised 时给出适当的错误。
您可能会发现在命名时遵循源代码中的一些简单规则很有用;
inputs are denoted by i_yourinputname
outputs are denoted by o_youroutputname
inout are denoted by io_yourinputoutputname
wire are denoted by w_yourwirename
reg are denoted by r_yourregname
因为这可以避免混淆,是开始学习 verilog 时尽快养成的好习惯。
我正在尝试制作一个带有溢出标志的简单 32 位 ALU,然后将 ALU 的输入和结果输出到屏幕,但我在连接测试台的元件时遇到了一些问题。我收到此错误:
test_32bALU.v:15: error: Wrong number of ports. Expecting 4, got 5. test_32bALU.v:33: error: Unable to bind wire/reg/memory
test_unit.overflow' in
alu_test'2 error(s) during elaboration.
我刚刚开始使用 Verilog,我对语法有一个基本的了解。我知道我不应该问调试问题,但这是我唯一的希望。我的教授或助教不会回应我的帮助请求。如果有人能帮我指出我的错误,我将不胜感激。
这是我的 32bALU.v 文件:
module alu(
input signed[31:0] a,b,
input[3:0] opcode;
output signed[31:0] c;
output overflow;
);
reg signed[31:0] result;
assign c = result;
reg tmp;
parameter
add = 4'b0000,
sub = 4'b0110,
sla = 4'b0001,
srai = 4'b0011;
always @(a,b,opcode)
begin
case(opcode)
add:
begin
c = a + b;
end
endcase
end
always @(c)
begin
if (c[32:31] == (2'b11 | 2'b10)) // Overflow
begin
tmp = 1'b1;
assign overflow = tmp;
end
else begin
tmp = 1'b0;
assign overflow = tmp;
end
end
assign result = c[31:0];
endmodule
test_32bALU.v
`timescale 1ns/1ps
module alu_test;
// Inputs
reg[31:0] a,b;
reg[2:0] opcode;
// Outputs
wire[31:0] c;
//wire [1:0] zero;
wire [1:0] overflow;
//wire [1:0] neg;
alu test_unit(
a,b, // Inputs
opcode,
c,
overflow
);
parameter
add = 4'b0000,
sub = 4'b0110,
sla = 4'b0001,
srai = 4'b0011;
initial begin
$display("op: a : b : c : reg_A : reg_B : reg_C");
$monitor(" %h:%h:%h:%h:%h:%h:%h",
opcode, a, b, c, test_unit.a, test_unit.b, test_unit.c);
$monitor("%h", test_unit.overflow);
//// add
#10 a=32'b0000_0000_0000_0000_0000_0000_0000_0001;
#10 b=32'b0000_0000_0000_0000_0000_0000_0000_0001;
opcode= add;//3'b000
#10 $finish;
end
endmodule
我很困惑为什么它说 "wrong number of ports"?我假设它是 module alu
和 alu test_unit
中的参数数量?它们具有相同数量的参数(a、b、c、操作码和溢出),那么我到底缺少什么?我究竟如何获得 overflow
的值?在我添加 overflow
参数之前它工作正常,所以我假设我做错了吗?
对于第二个错误,我在这里的某个地方读到它可能是由于缺少声明,但我已经声明了所有这些......所以我不确定是什么导致了错误。
我不确定这是否是问题所在,但您的模块定义不正确。应该是这样的:
module alu(
input signed[31:0] a,b,
input[3:0] opcode,
output signed[31:0] c,
output overflow
);
也许这对您的问题有帮助。
在模块声明中用逗号分隔输入和输出。
永远不要依赖模块参数的顺序,并且始终尝试使用名为 A 的模块;
module A(output wire c,
input wire a,
input wire b);
...
endmodule // A
使用它的实例;
A yourAname(.c(Bar),
.a(Foo1),
.b(Foo2));
这样,如果模块 I/O 的定义和顺序发生变化,此实例化将跟踪这些变化 and/or 在 simulated/synethesised 时给出适当的错误。
您可能会发现在命名时遵循源代码中的一些简单规则很有用;
inputs are denoted by i_yourinputname
outputs are denoted by o_youroutputname
inout are denoted by io_yourinputoutputname
wire are denoted by w_yourwirename
reg are denoted by r_yourregname
因为这可以避免混淆,是开始学习 verilog 时尽快养成的好习惯。