SystemVerilog端口连接赋值模式问题及解决方案咨询
SystemVerilog结构体端口实例化问题解答
问题1:'{1'b1, 1'b0}中前置单引号的含义
- 这个带单引号的
'{}'是SystemVerilog的**赋值模式(assignment pattern)**语法,和普通位拼接运算符{}不是同一个概念。 - 普通
{}仅用于将多个信号按位拼接成一个宽位信号;而'{}'专门用于给结构体、枚举、数组这类聚合类型直接赋值,会按照目标类型的成员顺序,把大括号内的值依次分配给对应成员。 - 以你场景中的packed结构体
type1为例,假设定义为typedef struct packed { bit sig_a; bit sig_b; } type1;,那么'{1'b1, 1'b0}会直接生成一个合法的type1类型对象:其中第一个成员sig_a被设为1'b1,第二个成员sig_b被设为1'b0,而非单纯的两位拼接信号。
问题2:解决Fusion Compiler的赋值模式端口连接报错
Synopsys Fusion Compiler对SystemVerilog语法的支持范围和VCS存在差异,不允许在端口连接中直接使用赋值模式,可通过以下两种方式调整RTL:
- 方式一:声明临时变量赋值后再连接端口
type1 sig_init_val; initial begin sig_init_val = '{1'b1, 1'b0}; end foo u_foo ( .sig(sig_init_val) ); - 方式二:采用位拼接+类型强制转换替代赋值模式
由于是packed结构体,其存储结构和普通宽位信号一致,可先拼接出对应位宽的信号,再强制转换为目标结构体类型:foo u_foo ( .sig(type1'( {1'b1, 1'b0} )) );
内容的提问来源于stack exchange,提问作者user4979733
相关产品推荐
相关产品推荐

