System verilog SystemVerilog中的赋值,编译错误-标记为';分配';
我有以下代码:System verilog SystemVerilog中的赋值,编译错误-标记为';分配';,system-verilog,System Verilog,我有以下代码: integer [31:0]R; integer [15:0]R_f1; integer [15:0]R_f2; assign R_f1 = R[15:0]; assign R_f2 = R[31:16]; 但由于assign的原因,它没有被编译。 我需要做哪些更改?它也可以在头文件中。Verilog XL的原始实现中存在一个错误,它忽略了整数声明的压缩维度。而integer/int/byte没有固定的大小。出于这些原因,SystemVerilog不允许为任何这些内置类型指定
integer [31:0]R;
integer [15:0]R_f1;
integer [15:0]R_f2;
assign R_f1 = R[15:0];
assign R_f2 = R[31:16];
但由于assign
的原因,它没有被编译。
我需要做哪些更改?它也可以在头文件中。Verilog XL的原始实现中存在一个错误,它忽略了
整数
声明的压缩维度。而integer/int/byte
没有固定的大小。出于这些原因,SystemVerilog不允许为任何这些内置类型指定压缩维度。使用位
或逻辑
此外,由于您使用SystemVerilog标记了该文件,请确保该文件具有*.sv后缀。你尝试做的另一个选择是
integer [31:0]R;
let R_f1 = R[15:0];
let R_f2 = R[31:16];
verilog
模式下编译代码的,并且得到了关于赋值语句的消息整数
类型上使用压缩维度。因此,以下声明是非法的:integer[31:0]R代码>。有些编译器只会忽略声明。所有整数在任何情况下都是32位宽的李>
因此,要在verilog
模式下修复它,您可以使用always@*
:
integer R = 10;
integer R_f1;
integer R_f2;
always @* R_f1 = R[15:0];
always @* R_f2 = R[31:16];
虽然根据您最初的问题,您需要使用不同类型的数据类型,这允许您使用实向量。在verilog
中,它们是reg
和网络类型之一,即wire
。使用wires
可以使用assign
语句,而使用reg
则需要使用always块。如下所示:
reg[31:0] R = 10;
reg[15:0] R_f1;
reg[15:0] R_f2;
always @* R_f1 = R[15:0];
always @* R_f2 = R[31:16];
由于您将问题标记为系统verilog问题,因此可以使用系统verilog类型之一,即逻辑
或位
。如果您使用这些,您可以同时应用,分配
或始终
块。顺便说一句,assign
也适用于整数
logic[31:0] R = 10;
logic[15:0] R_f1;
logic[15:0] R_f2;
assign R_f1 = R[15:0];
assign R_f2 = R[31:16];
只要确保在系统verilog模式下编译即可。它可以工作。你能解释一下转让和出租的区别吗@dave;我不明白为什么不能使用integer?如果我将整数改为逻辑或位,那么它仍然不起作用@dave_59let
是表达式的符号替换;没有分配,没有创建额外的信号。它像一个更正式的文本宏,因为它有一个范围,替换必须是一个正确的表达式,文本宏是全局的,几乎可以是任何任意文本。您需要显示一个更完整的示例,其中包含确切的错误消息。如果您更改为位
或逻辑
,但它仍然抱怨assign
语句,那么您没有显示的其他内容可能是错误的。它不起作用。我与vcs filename.sv一起使用-sverilog@Serge@Alex您使用了哪种工具进行编译?它是怎么不起作用的?又是怎么失败的?