如何将SystemVerilog接口转换为各个端口

时间:2015-02-01 20:54:09

标签: fpga system-verilog hdl

我正在研究将接口引入到当前未使用接口的代码库中。

为此,我需要使用适配器将接口再次转换为单独的信号。

我想这样做:

interface foo();
   logic           a;
   logic           b;
   logic           c;

   modport source(input a, c,
                  output b);
   modport sink(input b, c,
                output a);
endinterface // foo

module foo_source_to_ports
  (
   foo f,
   input logic a,
   input logic c,
   output logic b);

   assign f.a = a;
   assign f.c = c;
   assign b = f.b;
endmodule

module foo_ports_to_source
  (
   foo f,
   output logic a,
   output logic c,
   input logic b);

   assign a = f.a;
   assign c = f.c;
   assign f.b = b;
endmodule

module foo_sink_to_ports
  (
   foo f,
   input logic b,
   input logic c,
   output logic a);

   assign f.b = b;
   assign f.c = c;
   assign a = f.a;
endmodule

module foo_ports_to_sink
  (
   foo f,
   output logic b,
   output logic c,
   input logic a);

   assign b = f.b;
   assign c = f.c;
   assign f.a = a;
endmodule

我想知道是否有人知道更好的方法。我想我不是唯一有这个问题的人。

2 个答案:

答案 0 :(得分:0)

我认为你是在思考它。为什么不直接在RTL中实例化接口,并使用assign语句将其信号直接连接到其他信号?

即使您使用为您执行这些分配的适配器,您仍需要在其实例化时为其指定所有端口连接,除了它包含的分配列表。您将拥有大量冗余信息(因此,如果需要更改,您的代码中需要编辑很多地方)。

答案 1 :(得分:-1)

这段代码看起来很奇怪,因为:

  1. 模块端口列表包含接口和重复的逻辑端口。
  2. 接口端口没有指示其角色的modport。
  3. 您没有展示如何对这些模块进行实例化和互连。
  4. 我知道vcs支持RTL中的接口端口,但是mvsim不支持。

    这就是我所期望的:

    module source (
      foo.source f
    )
    // Use interface
    endmodule
    
    module sink(
      foo.sink f
    );
    
    module top();
      foo f;
    
      source u_source(.f(f));
      sink u_sink(.f(f));
    endmodule
    

    就我个人而言,我认为这是编写RTL的一种极好方法,可以使代码更清晰,更易于维护。但是,EDA支持似乎很不稳定。