You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SystemVerilog匿名结构体字段导出至顶层模块的语法疑问

SystemVerilog匿名结构体导出与模块连接实现

原RTL代码

typedef struct packed {
  logic [1:0][3:0] a;
  struct packed {
    logic [4:0] b;
    logic c;
    logic [1:0] d;
  }  e; // anonymous packed struct field
} s0;

module ip( input s0  p );
endmodule

module top();
endmodule

需求说明

  1. 将ip模块的p.e字段导出到top模块的端口
  2. 在top内部连接ip模块,使ip.p.e与top端口互连,ip.p.a保持悬空

实现方案与语法说明

是否需要新建typedef?

两种方案都可行,但新建typedef是更规范、易维护的选择,尤其是脚本自动生成场景。SystemVerilog支持通过父结构体直接引用匿名子结构体的类型,无需重复编写结构体定义。

方案1:新建typedef(推荐)

直接通过父结构体类型引用匿名子结构体生成typedef,脚本只需提取父结构体名和子字段名即可,避免重复编写结构体内容引发错误。

完整代码示例:

typedef struct packed {
  logic [1:0][3:0] a;
  struct packed {
    logic [4:0] b;
    logic c;
    logic [1:0] d;
  }  e; // anonymous packed struct field
} s0;

// 基于父结构体引用生成匿名子结构体的typedef
typedef s0::e s0_e;

module ip( input s0  p );
endmodule

module top(input s0_e p);
  // 实例化ip模块,用聚合赋值完成连接:a悬空赋值为'x,e连接top端口
  ip u_ip (
    .p( '{ a: 'x, e: p } )
  );
endmodule

方案2:不新建typedef,直接引用类型

如果不需要复用该子结构体类型,也可以直接在top端口中用s0::e声明类型:

typedef struct packed {
  logic [1:0][3:0] a;
  struct packed {
    logic [4:0] b;
    logic c;
    logic [1:0] d;
  }  e; // anonymous packed struct field
} s0;

module ip( input s0  p );
endmodule

module top(input s0::e p);
  ip u_ip (
    .p( '{ a: 'x, e: p } )
  );
endmodule

连接逻辑说明

用SystemVerilog的聚合赋值'{ a: 'x, e: p }完成ip模块的端口赋值:

  • a: 'x:将ip.p.a赋值为不定态,等价于悬空,综合工具会识别为未连接的端口
  • e: p:直接将top的端口p与ip.p.e互连

内容的提问来源于stack exchange,提问作者jel88

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 13:32:03