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

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类型信号的变化触发逻辑,这在实际硬件中是无法实现的(硬件只能识别时钟边沿)。建议改为时钟同步逻辑:

  1. 给lpf900模块添加时钟输入端口:
    module lpf900 (input logic clk, input real inStream, output real outStream);
    
  2. 将敏感列表改为时钟边沿触发:
    always @(posedge clk) begin
      shiftFirMemory(inStream);
      outStream = computeSingleOut();
    end
    
  3. 在测试平台中连接时钟信号到滤波器模块。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 02:57:32