在接口内使用时钟块和 modports

Using clocking blocks and modports inside Interfaces

有人可以提示我为什么这个带有 modports 和时钟块的接口可能不起作用吗?

interface axis (input logic aclk );
 logic [15:0] tdata_s;
 logic        tvalid_s;
 logic        tready_s;

 logic [15:0] tdata_m;
 logic        tvalid_m;
 logic        tready_m;


 // clocking block for AXI Stream master
 clocking cb_axis_mst @(posedge aclk);
  default input #1step output #3ns;
  output  tdata_m;
  output  tvalid_m;
  input   tready_m;
 endclocking



 // clocking block for AXI Stream slave
  clocking cb_axis_slv @(posedge aclk);
   default input #1step output #1ns;
   input   tdata_s;
   input   tvalid_s;
   output  tready_s;
  endclocking


  // AXI stream master modport for testbench only
  modport tb_axis_mst_mp(clocking cb_axis_mst);

  // AXI stream slave modport for testbench only
  modport tb_axis_slv_mp(clocking cb_axis_slv);

endinterface

QuestaSIM 10.5c 给了我一系列这样的错误:

** 错误:(vsim-3773) ../../../../rtl/test_driver.sv(37):接口项 'tvalid_m' 不在 modport [=23 中=].

如果我将端口添加到 modport,问题就会消失,但我的理解是只使用时钟块就足够了。

完整代码在这里:https://www.edaplayground.com/x/5FzC

你的理解不正确。将时钟块添加到 modport 只能让您访问时钟块创建的信号,而不是它引用的信号。

使用时钟块信号时,您需要引用时钟块范围,即 AXIS_MST.cb_axis_mst.tvalid_m。而不是 @posedge AXIS_MST.aclk,只需使用 @AXIS_MST.cb_axis_mst.

关于您的测试台的另一条评论:删除嵌套的 program/endprogram 语句;它们毫无用处。 Do not use program blocks