2015-12-23 44 views
1

創建堆積陣列我想創建確實SystemVerilog中以下任務:SystemVerilog的:使用變量

  1. 接收3個輸入參數和1個輸出參數。
  2. 隨機化數據並將數據分配給位變量(輸出參數)。

    1. task rand_wr_data(input int size, int data_range_hi, int data_range_lo, output bit [31:0] data); 
    2.  bit unsigned [(size - 1):0] rand_data_bits; 
    3.  bit unsigned [(data_range_hi - data_range_lo):0] wr_data_bits; 
    4.  
    5.  int unsigned rand_data = $urandom(); 
    6.  wr_data_bits = rand_data; 
    7.  data = wr_data_bits << (data_range_lo + 1); 
    8. endtask: rand_data 
    

上面的代碼將給我一個錯誤爲非恆定表達誤差對線2和3由此我在聲明的範圍內爲一個陣列使用的常數。我試過以下,但無濟於事。

[parameter | localparam | const] int data_size = size; 

所以,我有幾個疑問如下:

  1. 有沒有一種方法來創建一個使用變量封裝陣列像在我的代碼?
  2. 有沒有另外一種方法可以做我想做的事情?
  3. 我可以接收可變大小的數組作爲任務參數,而不是必須聲明大小的數組嗎?
  4. 在我的代碼的第6行,我想分配一個unsigned int到一個32位數組,但我收到不同的結果。我怎麼能做到這一點?

謝謝。

回答

3

參考錯誤:非常量表達式。所有打包變量大小必須定義在編譯時間。但是在這裏您提供的是運行時間的大小,而不是可行的。此後是錯誤。

可以有如下一些有用的和不那麼有用的解決方法:

聲明sizedata_range_hidata_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鏈接。

+0

非常感謝。您已經從SystemVerilog Cookbook中提取了重要的一點,以便更容易理解。我已按照建議實施並且代碼正在工作。 – user3531168