【问题标题】:SystemVerilog Clocking Blocks in Bi-Directional Interface双向接口中的 SystemVerilog 时钟模块
【发布时间】:2016-02-03 19:24:23
【问题描述】:

假设我有一个双向接口。我希望 TB 能够从 DUT 接收数据,并且我希望 TB 能够将数据驱动到 DUT。我需要在我的代码中添加一个clocking 块,因为我有竞争条件问题。我可以通过在正确的位置放置一个小#1 来解决这些问题,但我知道时钟块是正确的解决方案。我遇到困难的部分是双向部分。如果它是一个方向,我可能没问题,但是双向接口的语法让我很吃惊。制作 2 个时钟模块、2 个 modport 或其他东西是正确的解决方案吗?

interface MyInterface
  (input bit i_Clk);

  logic [15:0] r_Data;
  logic        r_DV = 1'b0;

  clocking CB @(posedge i_Clk);
    default input #1step output #1step;    
  endclocking : CB

  task t_Clock_Cycles(int N);
    repeat (N) @(posedge i_Clk);
  endtask : t_Clock_Cycles

  modport Driver   (clocking CB, output r_Data, r_DV);
  modport Receiver (clocking CB, input  r_Data, r_DV);

endinterface : MyInterface


package MyPackage;

  class MyDriver;
    virtual MyInterface.Driver hook;

    function new(virtual MyInterface.Driver hook);
      this.hook    = hook;
    endfunction : new

    task t_Drive(input [15:0] i_Data);
      forever
        begin
          hook.CB.r_Data = i_Data;
          hook.CB.r_DV   = 1'b1;
          hook.CB.t_Clock_Cycles(1);
        end
    endtask : t_Drive

  endclass : MyDriver

endpackage : MyPackage


module MyModule;
  import MyPackage::*;
  logic r_Clk = 1'b0;
  MyInterface hook(.i_Clk(r_Clk));
  always #5 r_Clk = ~r_Clk;
  MyDriver d1   = new(hook.Driver);

  initial
    begin
      d1.t_Drive(16'hABCD);
    end
endmodule // MyModule

【问题讨论】:

  • 您将过于详细地说明双向性的含义。我只看到那里有一个驱动程序可以驱动你的“数据”信号。
  • 您正在对我认为您希望同步的端口使用阻塞分配 (=)。这可能是您的竞争条件的来源。将它们更改为 <= 可能会有所帮助。
  • @Tudor,你说得对,我没有包括接收器类,但我确实有一个。
  • 我的意思是inout 信号。您的信号有一个定义的方向,从驱动器到接收器。只是您希望他们每个人都具有不同的权限 w.r.t.他们被允许对信号做什么。

标签: system-verilog


【解决方案1】:

使用时钟模块的全部意义在于声明您要同步访问哪些信号。您应该将信号添加到时钟块:

clocking CB @(posedge i_Clk);
  default input #1step output #1step;
  inout r_Data;
  inout r_DV;
endclocking : CB

由于您还希望驱动程序和接收器具有不同的访问权限,这意味着您需要两个不同的时钟块:

clocking CB_driver @(posedge i_Clk);
  default input #1step output #1step;
  output r_Data;
  output_DV;
endclocking : CB_driver

// ... direction reversed for CB_receiver

很遗憾,不能说您在驱动程序/接收器类中引用了某个时钟块:

class Driver
  virtual MyInterface.CB_driver hook;  // !!! Not allowed
endclass

如果您想限制您的驱动程序只能通过CB_driver,您可以使用modport

interface MyInterface;
  modport Driver(CB_driver);
endinterface

class Driver;
  virtual MyInterface.Driver hook;
endclass

这样您可以在驱动信号时引用hook.CB_driver。您的接收器也是如此。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多