SystemVerilog中分配,编译错误-令牌为“分配”

时间:2018-10-30 19:42:59

标签: 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未被编译。 我需要做些什么改变?它也可以在头文件中。

2 个答案:

答案 0 :(得分:2)

Verilog-XL的原始实现中有一个错误,它忽略了integer声明的打包维。并且integer/int/byte没有固定大小。由于这些原因,SystemVerilog不允许为任何这些内置类型指定打包尺寸。请改用bitlogic

此外,由于您使用SystemVerilog标记了此文件,因此请确保该文件具有* .sv后缀。您尝试做的另一种选择是

integer [31:0]R;

let R_f1 = R[15:0];
let R_f2 = R[31:16];

答案 1 :(得分:0)

  1. 取决于您使用的语言。在verilog中,只能使用连续分配来分配网络类型。 integer不是网络类型,因此在verilog中不允许这些分配。我猜您是在verilog模式下编译代码的,并且收到了有关赋值语句的消息。
  2. 也不允许在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类型,即logicbit。如果使用它们,则可以将assignalways两者都应用于它们。顺便说一句,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模式进行编译即可。