You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Verilog实现8位超前进位加法器(CLA)仿真异常求助

解决8位CLA低4位Sum显示X的问题

看起来你遇到的问题主要来自两个核心错误:测试平台里的错误赋值方式,以及4位CLA模块的未完成端口连接。让我一步步帮你排查和修复:

1. 测试平台中使用assign语句的致命错误

在你的测试平台CLA_TB的initial块里,你用assign给carryIn、A、B这些reg类型变量赋值——这是Verilog里的典型误用!

assign是连续赋值语句,它会持续驱动信号;而reg类型变量本身是由过程块(比如initial/always)驱动的。当你在initial里用assign给reg赋值时,相当于给这个信号创建了两个驱动源:reg的默认初始值(X)和assign的赋值,这会直接导致信号冲突,最终carryIn变成X。

第一个4位CLA模块的carryIn是X,会连锁导致它内部的C[0]是X,进而所有C信号和Sum信号都变成X——这就是你看到低4位Sum全为X的直接原因。

修正测试平台的赋值方式

把initial里的assign全部换成普通的阻塞赋值(=)即可:

initial begin
    // Start with the carryIn set to 0
    carryIn = 0;
    // The standard first test. Set
    // A = b0000 0001 and B = b0000 0001
    // Answer should be Sum = b0000 0010
    A = 8'b00000001;
    B = 8'b00000001;
    #20
    // Next, set A = b0001 1011 and
    // B = b1101 0111. Answer should
    // be Sum = b1111 0010 = hF2.
    A = 8'b00011011;
    B = 8'b11010111;
    #20
    // Finally, try setting the carryIn
    // to 1 and then test A = b0111 1011
    // and B = b1101 0011. Answer should be
    // Sum = 0100 1111 w/ overflow carry
    carryIn = 1'b1;
    A = 8'b01111011;
    B = 8'b11010011;
    #20
    $finish;
end

2. 4位CLA模块的carryOut端口未赋值

你的CLA4Bit模块定义了carryOut输出端口,但从头到尾都没给它赋值!这会导致这个端口始终是X,虽然你说高4位加法正常,但这只是巧合(比如高4位测试用例里不需要进位输入),后续扩展到64位时这个问题会彻底爆发。

对于4位CLA,carryOut是第4位的进位输出,你可以用已经定义好的组生成信号GG和组传播信号PG来简洁计算:

assign carryOut = GG | (PG & carryIn);

这个公式的逻辑是:要么组内生成进位(GG),要么组内全传播且输入进位有效(PG & carryIn)。

把这行代码添加到CLA4Bit模块的末尾即可。

3. 8位CLA模块的carryOut未赋值(额外修复)

你的CLA8Bit模块里定义了c7(第二个4位CLA的carryOut),但没有把它赋值给模块的carryOut输出,这会导致8位CLA的进位输出始终是X,需要补充:

assign carryOut = c7;

总结

修正这三个问题后,你的仿真应该就能正常运行了:低4位Sum不再是X,8位CLA的进位输出也能正确工作,为后续搭建64位CLA打好基础。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 09:25:29