Vivado波形窗口输入全Z:定点复数乘法Verilog代码求助
问题分析与修正方案
核心问题
你的代码存在两个关键错误,直接导致仿真异常:
- 用
initial块实现组合逻辑:initial块仅在仿真0时刻执行一次,无法响应输入信号的后续变化,且实际综合时会被完全忽略。 - 测试平台未维持仿真周期:当前测试平台仅在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
相关产品推荐
相关产品推荐

