我有此代码:
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
未被编译。
我需要做些什么改变?它也可以在头文件中。
答案 0 :(得分:2)
Verilog-XL的原始实现中有一个错误,它忽略了integer
声明的打包维。并且integer/int/byte
没有固定大小。由于这些原因,SystemVerilog不允许为任何这些内置类型指定打包尺寸。请改用bit
或logic
。
此外,由于您使用SystemVerilog标记了此文件,因此请确保该文件具有* .sv后缀。您尝试做的另一种选择是
integer [31:0]R;
let R_f1 = R[15:0];
let R_f2 = R[31:16];
答案 1 :(得分:0)
integer
不是网络类型,因此在verilog中不允许这些分配。我猜您是在verilog
模式下编译代码的,并且收到了有关赋值语句的消息。integer
类型上打包尺寸。因此,以下声明是非法的: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类型,即logic
或bit
。如果使用它们,则可以将assign
或always
两者都应用于它们。顺便说一句,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模式进行编译即可。