systemverilog - >从实例化另一个接口的接口传递参数

时间:2016-04-06 06:57:01

标签: verilog system-verilog

我正在尝试将接口传递给一个接口数组的模块。

JavaPairReceiverInputDStream<String, String> kafkaStream = KafkaUtils.createStream(ssc, this.getZkQuorum(), this.getSparkGroup(), topicsSet);

        JavaDStream<String> lines = kafkaStream.map(new Function<Tuple2<String, String>, String>() {

            @Override
            public String call(Tuple2<String, String> tuple2) {

                // Extract transation
                String value = tuple2._2();

                // Do something here...
                String result = executeSomething(value);

                return result;
            }
        });

所以,我的问题是, my_front_interface 的数组元素是否具有不同的 DATA_WIDTH 值。如果是这样,怎么样?在上面定义的代码中, my_front_interface 的所有数组元素的默认 DATA_WIDTH 为4.

由于

2 个答案:

答案 0 :(得分:3)

根据我的评论,在给定代码中似乎有许多编译错误。然而,根据我的理解,我试图解决它们。

为了创建不同的 DATA_WIDTH个实例,接口front_interface必须在各种情况下获取有关DATA_WIDTH的信息。因此,front_interface实体添加参数数组。该数组的大小NO_OF_IN_PORTS参数决定。

此外,您必须使用generate块来创建front_port多个实例。每个实例从front_interface实体的参数数组中选取一个元素。

我创建了以下代码覆盖 DATA_WIDTH 的默认值,并创建唯一数据宽度的实例。

interface front_port #(parameter DATA_WIDTH = 4);
    logic   [DATA_WIDTH - 1 : 0]   data;
    logic                          acknowledge;

    modport f_interface(input data, output acknowledge);

  initial
    begin : DEBUG_DISPLAY
      $display("DATA_WIDTH for %m is %0d",DATA_WIDTH);
    end
endinterface

// Use array DATA_WIDTH here, for varying data widths.
interface front_interface #(parameter NO_OF_IN_PORTS = 3, int DATA_WIDTH[NO_OF_IN_PORTS] = '{1,2,3});
  genvar i;
  generate // generate block for multiple instances
    begin : MULTIPLE_INSTANCES
      for(i=0;i<NO_OF_IN_PORTS;i++)
        begin : UNIQUE_DATA_WIDTH
          // Pick up each element from array to create varying DATA_WIDTH instances
          front_port #(.DATA_WIDTH(DATA_WIDTH[i])) front_ports();
        end
     end
  endgenerate
endinterface

module A #(parameter NO_OF_IN_PORTS = 3)
          (front_interface fi_if);
endmodule

module testbench;

  // Override DATA_WIDTH here for different instances
  front_interface #(.NO_OF_IN_PORTS(3), .DATA_WIDTH('{4,5,6}))  my_front_interface();

  A #(.NO_OF_IN_PORTS(3)) a1(my_front_interface);

endmodule

<强>输出

DATA_WIDTH for testbench.my_front_interface.MULTIPLE_INSTANCES.UNIQUE_DATA_WIDTH[0].front_ports.DEBUG_DISPLAY is 4
DATA_WIDTH for testbench.my_front_interface.MULTIPLE_INSTANCES.UNIQUE_DATA_WIDTH[1].front_ports.DEBUG_DISPLAY is 5
DATA_WIDTH for testbench.my_front_interface.MULTIPLE_INSTANCES.UNIQUE_DATA_WIDTH[2].front_ports.DEBUG_DISPLAY is 6

请参阅this page以传递实体中的参数数组。另外,SystemVerilog IEEE 1800-2012第27节对generate块有帮助。

答案 1 :(得分:0)

是的,它会根据DATA_WIDTH创建data,默认为4位。

检查以下代码及其输出。 (在代码中,具有不同参数值的2个接口阵列f & f5front_interface中实例化,以使事情更加清晰。

interface front_port #(parameter DATA_WIDTH = 4);
  logic [DATA_WIDTH - 1 : 0] data;
  logic acknowledge;

  modport f_interface(input data, output acknowledge);
endinterface

interface front_interface #(parameter NO_OF_IN_PORTS = 3);
  // To create array of front_port
  front_port f[NO_OF_IN_PORTS - 1 : 0](); // data should be 4 bits wide
  front_port #(5) f5[NO_OF_IN_PORTS - 1 : 0](); // data should be 5 bits wide
endinterface

module A #(parameter NO_OF_IN_PORTS = 3) (front_interface x); 
  initial
    begin
      $display ("Size of x.f[%0d].data = %0d", 0, $size(x.f[0].data));
      $display ("Size of x.f[%0d].data = %0d", 1, $size(x.f[1].data));
      $display ("Size of x.f[%0d].data = %0d", 2, $size(x.f[2].data));

      $display ("Size of x.f5[%0d].data = %0d", 0, $size(x.f5[0].data));
      $display ("Size of x.f5[%0d].data = %0d", 1, $size(x.f5[1].data));
      $display ("Size of x.f5[%0d].data = %0d", 2, $size(x.f5[2].data));
    end
endmodule


module testbench ();
  front_interface #(3)  my_front_interface();

  A #(3) (my_front_interface);
endmodule

代码输出:

Size of x.f[0].data = 4
Size of x.f[1].data = 4
Size of x.f[2].data = 4
Size of x.f5[0].data = 5
Size of x.f5[1].data = 5
Size of x.f5[2].data = 5