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

顶层模块接口端口未连接报错,如何修正SystemVerilog测试代码?

问题原因

你的test模块定义了dut_if.tb类型的端口tb_if,但当test作为顶层模块时,没有外部信号可以连接这个接口端口,触发了“接口端口未连接”的错误。同时模块内部又实例化了独立的dut_if实例vif,代码中同时使用tb_if和vif,属于无关联的重复接口实例,逻辑混乱。

要兼顾封装性解决问题,正确方式是拆分层次结构:将时钟生成、接口实例化放在顶层模块,让test作为子模块通过端口接收接口实例,保证test模块的可重用性。


修改后的代码

1. 保持接口定义不变

interface dut_if(input logic clk);
  logic [7:0] data;
  logic valid;
  logic ready;
  // Clocking block for the testbench (Driver/Monitor)
  default clocking cb @(posedge clk);
    default input #1step output #2ns;
    output data, valid;
    input  ready;
  endclocking
  // Modport to restrict the testbench to using the clocking block
  modport tb (clocking cb);
  // 后续连接DUT时可添加对应modport
  // modport dut(input clk, data, valid, output ready);
endinterface  

2. 修改test模块,专注于激励逻辑

移除内部的时钟和接口实例,仅通过端口接收外部接口:

module test (dut_if.tb tb_if);
  initial begin
    // Synchronize to the clocking event
    @(tb_if.cb);  
    // Drive signals through the clocking block
    tb_if.cb.data  <= 8'hA5;
    tb_if.cb.valid <= 1;  
    // Wait for 2 clock cycles
    repeat (2) @(tb_if.cb);  
    // Sample a signal
    if (tb_if.cb.ready) 
      $display("DUT is ready at time %t", $time);     
    tb_if.cb.valid <= 0;
  end 
  initial #50 $finish; 
  initial begin
    $dumpfile("dump.vcd"); 
    $dumpvars;
  end
endmodule

3. 新增顶层模块top,负责层次连接

module top;
  logic clk;
  
  // 实例化接口
  dut_if vif(.clk(clk)); 
  // 将接口的tb modport连接到test模块端口
  test tb(.tb_if(vif.tb));
  
  // 生成时钟
  initial begin
    clk = 0;
    forever #5 clk = ~clk;    
  end 

  // 后续接入DUT时,在此实例化并连接接口的dut modport
  // dut u_dut(.dut_if(vif.dut));
endmodule

关键修改说明

  • 拆分层次后,test模块仅负责激励逻辑,与时钟、接口实例解耦,提升了封装性和可重用性
  • 统一使用同一个接口实例,避免了原代码中接口实例混乱的问题
  • 顶层模块集中管理时钟和接口,符合SystemVerilog模块化设计的最佳实践

内容的提问来源于stack exchange,提问作者Tang Y

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.02 02:23:10