You need to enable JavaScript to run this app. TestBench仿真波形中64位ALU输出高阻抗问题排查
优惠活动
大模型
产品
解决方案
定价
更多

TestBench仿真波形中64位ALU输出高阻抗问题排查

64位ALU仿真输出高阻抗问题解决

问题背景

设计的64位ALU接收64位输入A、B与进位输入cin,输出64位运算结果result与1位进位输出cout;采用5位功能选择信号FS实现控制:

  • FS[0]通过2选1MUX控制B是否取反
  • FS[1]同理控制A是否取反
  • FS[4:2]通过8选1MUX选择具体运算类型(加、减、逻辑运算等)

各独立组件逻辑验证无问题,但顶层模块的例化连接存在不确定问题,仿真中ALU输出显示高阻抗。

高阻抗问题的核心原因

高阻抗输出的核心诱因是顶层ALU模块未显式声明内部连接信号的类型与位宽:
在Verilog标准中,未显式声明的信号会被隐式推断为1位宽的wire型。你在顶层中用到的firstoutA、secoutB、sum、left、right均为未声明的内部信号,本该为64位宽,却被隐式当成1位,导致跨位宽的信号无法正常传递,最终表现为输出高阻抗。

除此之外还存在多处会引发逻辑错误的隐性问题:

  • 测试平台中定义A、B为64位寄存器,但初始赋值时使用8位宽立即数,不符合64位ALU的设计规范,容易引发仿真歧义
  • 顶层firstmux、secmux的取反输入直接使用!A、!B:!是逻辑取反运算符,仅能输出1位的全0或全1,不是按位取反,应使用按位取反运算符~
  • 移位器的例化使用位置连接且端口顺序不匹配:Alu_shifter模块定义的端口顺序为(shiftA, right输出, left输出),原顶层例化Alu_shifter u5 (A, left, right)将移位器的右移输出接到顶层left信号、左移输出接到顶层right信号,逻辑完全颠倒
  • 8选1MUX的D6、D7输入接1'b0,但MUX输入定义为64位宽,会发生跨位宽隐式扩展,引发仿真警告
  • 所有模块例化均使用位置连接,端口顺序错位后无法及时排查,属于可维护性风险

修复步骤

  1. 显式声明顶层内部信号
    在ALU模块的端口声明后,添加内部连线的位宽与类型声明,解决隐式1位线的问题:
// 所有内部信号均为64位宽wire型
wire [63:0] firstoutA, secoutB, sum, left, right;
  1. 修正取反运算符
    将逻辑非运算符!替换为按位非运算符~,同时改用命名端口例化避免顺序错位:
firstmux u1 (
    .a(A), 
    .nota(~A), 
    .firstS(FS[1]), 
    .firstoutA(firstoutA)
);
secmux u2 (
    .b(B), 
    .notb(~B), 
    .secS(FS[0]), 
    .secoutB(secoutB)
);
  1. 修正移位器例化的端口对应关系
    改用命名端口连接,确保移位输出信号对应正确:
Alu_shifter u5 (
    .shiftA(A), 
    .right(right), 
    .left(left)
);
  1. 修正测试平台的初始赋值
    将A、B的初始赋值改为64位宽,避免位宽歧义:
initial begin
    A = 64'b11001100;
    B = 64'b11001101;
    FS = 5'b01101;
    cin = 1;
end
  1. 修正8选1MUX的输入位宽
    将原接地的1位1'b0改为64位宽的零值64'b0,同时改用命名端口例化:
eight_one_mux u7 (
    .D0(firstoutA & secoutB), 
    .D1(firstoutA | secoutB), 
    .D2(sum), 
    .D3(firstoutA ^ secoutB),
    .D4(left), 
    .D5(right), 
    .D6(64'b0), 
    .D7(64'b0), 
    .S(FS[4:2]), 
    .out(result)
);

修复后顶层ALU完整示例

module ALU(A, B, FS, cin, cout, result); 
input [63:0] A, B;
input [4:0] FS;
input cin;
output cout;
output  [63:0] result;

// 显式声明内部连线
wire [63:0] firstoutA, secoutB, sum, left, right;

// 8选1输出选择MUX
eight_one_mux u7 (
    .D0(firstoutA & secoutB), 
    .D1(firstoutA | secoutB), 
    .D2(sum), 
    .D3(firstoutA ^ secoutB),
    .D4(left), 
    .D5(right), 
    .D6(64'b0), 
    .D7(64'b0), 
    .S(FS[4:2]), 
    .out(result)
);

// 加法器
adder u6 (
    .addA(firstoutA), 
    .addB(secoutB), 
    .nic(cin), 
    .sum(sum), 
    .cout(cout)
);

// A输入选择器(原变量/按位取反)
firstmux u1 (
    .a(A), 
    .nota(~A), 
    .firstS(FS[1]), 
    .firstoutA(firstoutA)
);

// B输入选择器(原变量/按位取反)
secmux u2 (
    .b(B), 
    .notb(~B), 
    .secS(FS[0]), 
    .secoutB(secoutB)
);

// 移位器
Alu_shifter u5 (
    .shiftA(A), 
    .right(right), 
    .left(left)
);

endmodule

补充说明:原firstmux、secmux内部的default分支赋值1'bx给64位输出,虽然仿真中FS[0]、FS[1]仅为1位,不会触发default,但建议改为64'bx保持位宽一致。


内容的提问来源于stack exchange,提问作者RhinoECE

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.31 02:15:10