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' inalu_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 alualu 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 时尽快养成的好习惯。