Verilog中的ALU:“;无法绑定wire/reg/memory“;

Verilog中的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,对语法有了基本的了解。我知道我不应该问调试问题,但这是我唯一的希望。我的教授或助教不会回应

我试图制作一个带有溢出标志的简单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,对语法有了基本的了解。我知道我不应该问调试问题,但这是我唯一的希望。我的教授或助教不会回应我的求助请求。如果这里有人能帮我指出我的错误,我将不胜感激

这是我的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、溢出)“我不知道为什么它不会检测到溢出端口…但是谢谢你的回答!好吧,也许溢出是一个关键字??试着将它重命名为其他名称。哦,它成功了。(溢出没有输出,但它仍然编译没有错误,所以它仍然是一个进步。)谢谢!