首页 > 解决方案 > 可以将互连解析为结构类型吗?

问题描述

我在详细说明以下 sv 代码时遇到错误,互连可以解析为结构吗?

 struct {
    byte a;
    reg b;
    shortint unsigned c;
  } myLocalStruct;

module top;
    interconnect n;
    structData sD(n);
endmodule

module structData( myLocalStruct x);

  initial begin
    $display ("a = %b b = %b c = %h", x.a, x.b, x.c);
    $display ("a = %b b = %b c = %h", x.a, 
         x.b, x.c);
     #1  $finish;
   end
 endmodule

标签: verilogsystem-verilogverification

解决方案


是的,您可以将互连与结构类型一起使用。但是,要将结构声明为您需要使用的端口类型typedef(如 Daves 回复中所示)。

此外,目的interconnect是在模块之间提供无类型连接,因此在单个模块中使用它是没有意义的。

从 lrm 6.6.8 开始:

声明为互连(互连网络或端口)的网络或端口表示无类型或通用网络。此类网络或端口只能表示网络端口和终端连接,不得用于任何程序上下文或任何连续或程序连续分配。互连网络或端口不得用于除 net_lvalue 表达式之外的任何表达式,其中表达式中的所有网络或端口也是互连网络。即使阵列中的不同位被解析为不同的网络类型,互连阵列也应被视为有效,如下例所示。

标准中有几个示例,这里是使用结构互连的另一个简单示例:

package is_pkg;
   typedef struct {
      bit         a,b,c;
   } S;
endpackage:is_pkg

module top();
   interconnect  bus;

   tb tb(bus);
   dut dut(bus);

endmodule // top

module tb import is_pkg::*; (output S so);
   initial
     so = '{0,1,1};
endmodule // tb

module dut import is_pkg::*; (input S si);
   always @*
     $display("struct: %b%b%b", si.a, si.b, si.c);

endmodule // dut

推荐阅读