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

Vivado波形窗口输入全Z:定点复数乘法Verilog代码求助

问题分析与修正方案

核心问题

你的代码存在两个关键错误,直接导致仿真异常:

  1. 用initial块实现组合逻辑:initial块仅在仿真0时刻执行一次,无法响应输入信号的后续变化,且实际综合时会被完全忽略。
  2. 测试平台未维持仿真周期:当前测试平台仅在0时刻赋值输入,10ns后打印信息但未阻止仿真立即结束,可能导致波形捕获不完整。

修正后的代码

顶层模块(修复组合逻辑实现)

module complex(
    input  signed [15:0] a,b,c,d,
    output reg signed [31:0] x,y,
    output reg signed [63:0] z  // 拼接实部和虚部,高32位为实部,低32位为虚部
);
    reg signed [31:0] ac,bd,ad,bc;

    // 用always @(*)实现组合逻辑,自动响应所有输入信号变化
    always @(*) begin
        ac = a * c;
        bd = b * d;
        ad = a * d;
        bc = b * c;

        x = ac - bd;  // 复数乘积的实部
        y = ad + bc;  // 复数乘积的虚部
        z = {x, y};   // 拼接实部与虚部
    end
endmodule

测试平台(完善仿真流程)

module complextb();
    reg signed [15:0] a,b,c,d;
    wire signed [31:0] x,y;
    wire signed [63:0] z;

    complex DUT (
        .a(a), .b(b), .c(c), .d(d),
        .x(x), .y(y), .z(z)
    );

    localparam SF = 2.0**-16.0;  // 定点数缩放因子

    initial begin
        // 初始化输入信号
        a = 16'b01011000_01000000; 
        b = 16'b00011001_01000000;
        c = 16'b01011000_01000000;
        d = 16'b00010100_01000000;

        #10;  // 等待组合逻辑稳定
        $display("实部: %f, 虚部: %f", $itor(x*SF), $itor(y*SF));

        // 可添加更多测试案例验证不同输入
        #10;
        a = 16'b00000000_00000001;
        b = 16'b00000000_00000000;
        c = 16'b00000000_00000001;
        d = 16'b00000000_00000000;
        #10;
        $display("实部: %f, 虚部: %f", $itor(x*SF), $itor(y*SF));

        #100;  // 延长仿真时间,方便波形观察
        $finish;  // 手动终止仿真
    end
endmodule

额外注意事项

  • 仿真时需在Vivado波形窗口中正确添加DUT的输入(a、b、c、d)和输出(x、y、z)信号,避免选错层级。
  • 若需编写可综合的硬件代码,务必用always块实现逻辑,initial块仅用于仿真初始化。
  • 当前定点数位宽设置合理:16位乘16位得到32位中间结果,减法/加法保持32位,无溢出风险。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 09:40:27