Verilog中的ALU:“;无法绑定wire/reg/memory“;
我试图制作一个带有溢出标志的简单32位ALU,然后将ALU的输入和结果输出到屏幕,但在连接测试台的元素时遇到了一些问题。我得到了这个错误: test_32bALU.v:15:错误:端口数错误。期望4,得到5。 test_32bALU.v:33:错误:无法绑定wire/reg/memoryVerilog中的ALU:“;无法绑定wire/reg/memory“;,verilog,modelsim,alu,Verilog,Modelsim,Alu,我试图制作一个带有溢出标志的简单32位ALU,然后将ALU的输入和结果输出到屏幕,但在连接测试台的元素时遇到了一些问题。我得到了这个错误: test_32bALU.v:15:错误:端口数错误。期望4,得到5。 test_32bALU.v:33:错误:无法绑定wire/reg/memory test\u unit.overflow'在alu\u test' 细化过程中出现2个错误 我刚开始学习Verilog,对语法有了基本的了解。我知道我不应该问调试问题,但这是我唯一的希望。我的教授或助教不会回应
test\u unit.overflow'在
alu\u test'
细化过程中出现2个错误
我刚开始学习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
测试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
我不明白为什么它说“错误的港口数量”?我假设它是模块alu
和alu测试单元
中的参数数?它们有相同数量的参数(a、b、c、操作码和溢出),那么我到底缺少什么呢?如何准确获取溢出的值?在我添加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的定义和顺序发生变化,该实例化将跟踪这些变化和/或在模拟/合成时给出适当的错误
您可能会发现,在命名时遵循源代码中的一些简单规则很有用
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时尽快养成的一个好习惯。它仍然不起作用:(这行特别是:`alu测试单元(a、b、操作码、c、溢出)“我不知道为什么它不会检测到溢出端口…但是谢谢你的回答!好吧,也许溢出是一个关键字??试着将它重命名为其他名称。哦,它成功了。(溢出没有输出,但它仍然编译没有错误,所以它仍然是一个进步。)谢谢!