能否创建兼容Testbench与模块连接的统一AXIS接口?
问题根源与解决方案
核心问题分析
vsim-3838警告的本质是TREADY信号被两个不同的驱动源同时赋值:一个是连续赋值(可能是接口内的默认赋值、或modport隐式驱动),另一个是过程赋值(DUT或Testbench中的always/initial块)。
在AXIS协议中,TREADY的驱动角色是明确的:
- Slave侧(通常是DUT)负责驱动TREADY,表明自身是否准备好接收数据
- Master侧(通常是Testbench)仅采样TREADY,不驱动它
你的代码功能正常是因为Verilog允许线网型信号的多驱动(通过线逻辑解决冲突),但工具会抛出警告提示潜在风险。
具体修正步骤
1. 修正接口的modport与Clocking Block定义
确保TREADY的驱动方向单一,只交给Slave侧:
interface axis_if #(parameter DATA_WIDTH=8) (input logic clk); logic tvalid; logic tready; logic [DATA_WIDTH-1:0] tdata; logic tlast; // Master modport:仅输出驱动类信号,采样TREADY modport master ( input clk, tready, output tvalid, tdata, tlast ); // Slave modport:仅输出TREADY,采样其他信号 modport slave ( input clk, tvalid, tdata, tlast, output tready ); // Testbench Master用Clocking Block:只采样TREADY,不驱动 clocking cb_master @(posedge clk); input tready; output tvalid, tdata, tlast; endclocking // Testbench Slave用Clocking Block(若需要):仅驱动TREADY clocking cb_slave @(posedge clk); input tvalid, tdata, tlast; output tready; endclocking endinterface
2. 移除接口内的默认连续赋值
如果你的接口中存在类似assign tready = 1'b0;的默认赋值,直接删除——把TREADY的驱动权完全交给DUT(Slave)或Testbench中的Slave角色模块,避免双重驱动。
3. 修正DUT与Testbench的连接逻辑
- DUT必须绑定
axis_if.slavemodport,仅通过过程块驱动TREADY:
module axis_dut(axis_if.slave s_axis); always @(posedge s_axis.clk) begin // 根据内部状态驱动TREADY(示例逻辑) s_axis.tready <= (s_axis.tvalid) ? 1'b1 : 1'b0; end endmodule
- Testbench作为Master时,仅通过
cb_master采样TREADY,绝不驱动它:
program axis_tb(axis_if iface); initial begin iface.cb_master.tvalid <= 1'b0; #10; iface.cb_master.tvalid <= 1'b1; iface.cb_master.tdata <= 8'h55; wait(iface.cb_master.tready); // 仅采样TREADY #10; iface.cb_master.tvalid <= 1'b0; end endprogram
关键注意点
- 不要混淆Clocking Block的输入输出方向:Master侧的Clocking Block永远只把TREADY设为
input - 禁止在接口、Testbench、DUT中同时对TREADY做赋值操作,保持驱动源唯一
内容的提问来源于stack exchange,提问作者Sergey Voloshchuk
相关产品推荐
相关产品推荐

