SystemVerilog实现FIR滤波器报错:inStream驱动与过程赋值冲突
问题分析与解决
错误根源
报错提示的核心是变量inStream存在多驱动冲突:
- 你的
stimulus程序将inStream声明为输出端口,通过时钟块myCk持续驱动该信号 - 测试平台
myTB的initial块(第22行)又直接对inStream进行过程赋值
SystemVerilog中,寄存器类型变量(这里real属于寄存器类)不允许被多个独立驱动源同时赋值,这会导致仿真器无法确定信号的最终值,因此抛出错误。
修复方案
删除myTB中直接赋值inStream的initial块,保留stimulus程序作为inStream的唯一驱动源。如果需要自定义测试序列,可将测试逻辑整合到stimulus程序内部,而非在测试平台中额外驱动。
修改后的测试平台代码:
`include "packages.sv" `include "programs.sv" module myTB(); real inStream, outStream; logic clk = 1'b0; always #5 clk = ~clk; stimulus myStim (clk, inStream, outStream); lpf900 mylpf900 (inStream, outStream); initial begin $dumpfile("dump.vcd"); $dumpvars; end // 信号监控 initial begin $monitor("Time = %0t, inStream = %f, outStream = %f", $time, inStream, outStream); end endmodule
额外优化建议
你的FIR滤波器模块使用always @(inStream)作为敏感列表,依赖real类型信号的变化触发逻辑,这在实际硬件中是无法实现的(硬件只能识别时钟边沿)。建议改为时钟同步逻辑:
- 给
lpf900模块添加时钟输入端口:module lpf900 (input logic clk, input real inStream, output real outStream); - 将敏感列表改为时钟边沿触发:
always @(posedge clk) begin shiftFirMemory(inStream); outStream = computeSingleOut(); end - 在测试平台中连接时钟信号到滤波器模块。
内容的提问来源于stack exchange,提问作者Giuseppe Strollo
相关产品推荐
相关产品推荐

