參考錯誤:非常量表達式。所有打包變量的大小必須定義在編譯時間。但是在這裏您提供的是運行時間的大小,而不是可行的。此後是錯誤。
可以有如下一些有用的和不那麼有用的解決方法:
聲明size
,data_range_hi
和data_range_lo
作爲參數。由於參數是評估期間編譯/細化時間,這應該工作。但是你不能直接在運行時改變這些參數。
task rand_wr_data (output bit [31:0] data);
parameter int size=8, data_range_hi=8,data_range_lo=0;
bit unsigned [(size - 1):0] rand_data_bits;
作爲替代和有效途徑,指SystemVerilog LRM 1800-2012部分13.8:
A parameterized subroutine allows the user to generically specify or define an implementation. When using that subroutine one may provide the parameters that fully define its behavior. This allows for only one definition to be written and maintained instead of multiple subroutines with different array sizes, data types, and variable widths.
及以下段落:
The way to implement parameterized subroutines is through the use of static methods in parameterized classes (see 8.10 and 8.25).
The class may be declared virtual in order to prevent object construction and enforce the strict static usage of the method.
您可以創建一個參數virtual
類裏面有static
任務。使用範圍分辨率運算符(::
)和參數覆蓋來調用此任務。
virtual class wrapper #(parameter int size=8, int data_range_hi=8, int data_range_lo=0);
static task rand_wr_data(output bit [31:0] data);
bit unsigned [(size - 1):0] rand_data_bits;
// ...
// ...
endtask
endclass
// ...
// in some module/class, call task
wrapper #(16,8,0)::rand_wr_data (a);
// ...
聲明類爲virtual
確保沒有物體可以爲該類創建:東西可以如下完成。 LRM第13.8節給出的例子也可能有用。
一個實例在EDAPlayground here。
來到您的問題:
Is there a way to create a packed array using variables like in my code?
是,如上所述。
Is there another way to do what I would like to do above?
可能有其他的方法一樣,可以在用戶運行時設置define
指令,但他們會留在整個模擬不變。
Can I receive variable size array as a task parameter instead of an array that has to have its size declared?
是的,如上所述。
In line 6 of my code, I would like to assign an unsigned int to a 32-bit array but I receive different result after that. How can I accomplish that?
位是默認unsigned
,所以沒必要申報bit unsigned
,只是bit
應工作;但這不是問題。這裏的問題似乎wr_data_bits
被定義爲bit unsigned [(data_range_hi - data_range_lo):0] wr_data_bits;
而rand_data
被定義爲int unsigned rand_data
。 大小都可能變化。
如果您通過31
作爲(data_range_hi - data_range_lo)
,值將匹配。給出的示例代碼鏈接顯示相同的值。
wr_data_bits = 5e23536 rand_data = 5e23536
我試過Google搜索它,但沒有找到太多的信息。有關更多信息,請參閱this鏈接。
非常感謝。您已經從SystemVerilog Cookbook中提取了重要的一點,以便更容易理解。我已按照建議實施並且代碼正在工作。 – user3531168