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

Task未更新Testbench中sclk等信号的问题排查求助

信号经Task处理后未更新的问题排查与修复

问题现象

Task内部逻辑可正常执行,但顶层tbench.sclk、MOSI.data等信号未发生全局更新,波形中无预期的电平变化。

相关代码

Testbench代码

//-------------------------------
timeunit 1ps;
timeprecision 1ps;

`define CLK_HALF_PERIOD             10
`define SCK_HALF_PERIOD             30

module tbench ();

logic      clk;
logic      sclk;
logic      RST;

hwpe_stream_intf_stream MOSI();
hwpe_stream_intf_stream MISO();
logic      try;
 initial begin
 spi_send (.addr({1'b1,3'b111,12'd1,16'd0  }),
           .data(1), 
           .MISO(try), 
           .MOSI(MOSI.data), 
           .SCK(sclk)); 
 end

  always
  begin
    # `CLK_HALF_PERIOD clk = 1;
    # `CLK_HALF_PERIOD clk = 0;
  end
 
task automatic spi_send (
        input  logic [31:0] addr,
        input  logic [31:0] data,
        input  logic        MISO, // not used
        ref    logic     MOSI,
        ref    logic      SCK
    );
        integer i = 0;
        $display ("add=%-32d",addr );
        for (i=0; i<32; i=i+1) begin
           MOSI  = addr[31-i];
            tbench.try  = MOSI;
            #`SCK_HALF_PERIOD
            tbench.sclk   = 1'b1;
            #`SCK_HALF_PERIOD;
            tbench.sclk  = 1'b0;
            $display("add", addr[30-i] , "          MOSI  ",MOSI);
        end
 endtask

endmodule  

Interface代码

interface hwpe_stream_intf_stream() ;

  logic                    valid;
  logic                    ready;
  logic                     data;
  logic [8/8-1:0] strb;

  modport source (
    output valid, data, strb,
    input  ready
  );
  modport sink (
    input  valid, data, strb,
    output ready
  );

endinterface

问题根源

  1. 形参未被利用,直接层级引用存在风险:任务定义了ref logic SCK形参,但未通过该形参操作sclk,反而直接使用tbench.sclk赋值。这种写法破坏了任务封装性,部分仿真器可能因信号解析优先级问题导致赋值未生效。
  2. 命名冲突引发解析歧义:任务形参名MOSI与顶层interface实例名MOSI重名,虽语法合法,但可能导致仿真器对信号赋值目标解析错误,使得MOSI.data未被正确更新。

修复方案

修改spi_send任务,改用形参操作信号并避免命名冲突,同时调整调用语句:

修改后的Task代码

task automatic spi_send (
        input  logic [31:0] addr,
        input  logic [31:0] data,
        input  logic        MISO, // not used
        ref    logic        mosi_data,  // 重命名形参,规避与顶层实例的命名冲突
        ref    logic        sck         // 直接通过形参操作目标信号
    );
        integer i = 0;
        $display ("add=%-32d", addr);
        for (i=0; i<32; i=i+1) begin
            mosi_data = addr[31-i];
            tbench.try = mosi_data;
            #`SCK_HALF_PERIOD;
            sck = 1'b1;
            #`SCK_HALF_PERIOD;
            sck = 1'b0;
            $display("addr bit %0d: %b, MOSI: %b", 31-i, addr[31-i], mosi_data);
        end
 endtask

修改后的Initial调用

initial begin
 spi_send (.addr({1'b1,3'b111,12'd1,16'd0}),
           .data(1), 
           .MISO(try), 
           .mosi_data(MOSI.data), 
           .sck(sclk)); 
 end

验证步骤

  1. 查看仿真控制台的$display输出,确认任务执行流程及信号赋值是否符合预期。
  2. 检查波形工具的时间刻度配置,确保30ps的半周期能被正确显示(可放大波形或调整时间轴范围)。
  3. 确认MOSI.data未被其他模块多驱动,避免信号冲突。

内容的提问来源于stack exchange,提问作者J. Damone

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 01:15:31