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
问题根源
- 形参未被利用,直接层级引用存在风险:任务定义了
ref logic SCK形参,但未通过该形参操作sclk,反而直接使用tbench.sclk赋值。这种写法破坏了任务封装性,部分仿真器可能因信号解析优先级问题导致赋值未生效。 - 命名冲突引发解析歧义:任务形参名
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
验证步骤
- 查看仿真控制台的
$display输出,确认任务执行流程及信号赋值是否符合预期。 - 检查波形工具的时间刻度配置,确保30ps的半周期能被正确显示(可放大波形或调整时间轴范围)。
- 确认
MOSI.data未被其他模块多驱动,避免信号冲突。
内容的提问来源于stack exchange,提问作者J. Damone
相关产品推荐
相关产品推荐

