2010-10-09 148 views
9

SystemVerilog添加了爲常見代碼段(函數,類型,常量等)提供名稱空間的包。但是由於包沒有實例化,所以它們不能被參數化,所以處理參數化成員是有問題的。在實踐中,我發現這非常有限,因爲我的自定義類型有很多參數指定字段寬度等。處理SystemVerilog包中的參數化

我一般通過使用帶有默認值的參數來處理此問題,並理解我將需要返回更改包某些應用程序的源代碼,這對我來說似乎非常錯誤。但我還沒有找到辦法更清楚地處理這個問題。例如:

package my_pkg; 
    parameter ADDR_MSB = 7; 
    parameter DATA_MSB = 31; 

    typedef struct { 
     logic [ADDR_MSB:0] address; 
     logic [DATA_MSB:0] data; 
    } simple_struct_t; 

endpackage 

有沒有人找到一個更清潔的方式來處理這個問題?我很想聽聽它,因爲我認爲軟件包是SV的一個非常強大的補充,可以實現更安全的代碼重用,但這種限制非常嚴重。

回答

1

是的,我同意。這是軟件包的一個缺失功能​​。

只是spitballin'在這裏,但你可以將你的參數抽象成一個secod包,並在編譯時使用正確的參數來調整你的包。我知道那不是你真正想要的,但它可能會讓你接近。

我想如果我在我的項目中遇到過這個問題,我最終會得到多個代表每個配置的包。

2

我有幾個想法。首先,我傾向於使用類而不是結構對數據進行建模。類可以被參數化,動態分配,隨機化,包含封面組等。我只在需要打包結構時才使用結構。打包的結構非常棒,因爲您可以像常規向量一樣分配給它們,然後使用命名字段訪問數據。非常好。 :)

其次,即使可以重新定義包參數,模擬中只有一個包的「實例」不能有多個具有不同參數值的專業化,就像可以用於模塊或類一樣。所以在我看來,取消參數並使用宏代替是一個可行的解決方案。雖然我不喜歡使用宏,但可以在不更改源代碼的情況下使用新值重新編譯。

+3

不夠公平,但我對設計代碼而不是測試平臺代碼更感興趣,而且對於日期類不能合成。 – JeffW 2010-10-23 15:13:39

+0

也與宏評論相關,我不明白這是如何真正改變任何東西。使用宏或參數可以修改代碼以在編譯時重新定義或更改該值。實際上對於參數來說,這個值的改變可以推遲到稍微靈活一點的精化時間。無論採用哪種方式,都會導致代碼混淆,因爲所使用的值對審閱者而言並不明顯。 – JeffW 2010-10-23 15:15:24

0

我不會說這是一個缺少的功能。數十年來,Verilog的宏已經完成了你所要做的事情。麻煩的是,爲了避免軟件包之間的衝突,你必須在命名方式上有相當的獨特性。這不好,但它的工作原理。

參數有點不同。它們用於根據實例定製實例(如VHDL泛型)。無論是邏輯模塊還是測試臺類。我唯一對他們的批評是,一旦你開始使用它們,它們會傾向於在整個層次結構中傳播,並且語法不完全緊湊。雖然非常強大,並且非常適合代碼重用。

+0

此處的問題與在同一設計的不同區域中使用的參數化類型有關。你可以按照上面所示的方法來完成它們,或者你可以使用'defined但是在設計中的不同區域需要相同類型的不同參數值(例如不同的地址寬度)時不起作用。從理論上講,你可以使用'define並記住在編譯單元之後重置或取消undef,但依賴於這是在我的經驗中遇到麻煩。 – JeffW 2010-11-09 14:17:41

+2

這絕對是一個缺失的功能!在以前只能用於非常可怕的宏濫用(例如類型參數)的語言中添加功能正在逐漸使HDLs可用...現在如果只有工具供應商實際上支持這些功能中的一部分;) – Chiggs 2014-03-21 12:57:03

1

這可能適用,也可能不適用,具體取決於您想要放在軟件包中的內容,但是如果您的工具支持,可以對界面進行參數化和綜合。

有一個在http://www.doulos.com/knowhow/sysverilog/tutorial/interfaces/

+0

這應該是一個很好的解決方法,但規範有一些不一致之處。在接口部分,有一個示例顯示了通過分層名稱(如my_ifc.inner_type)訪問接口中的類型。但是,語法不支持這一點 - 在語法中查看data_type和type_identifier的def; type_identifier是一個簡單的名稱(由如何處理類型分辨率驅動)。我認爲synopsys可能允許這樣做,但節奏並不像大約一年前那樣。所以請謹慎使用。 – JeffW 2011-03-20 15:39:42

1

一個例子我有同樣的問題和同事建議如下:

//定義。SV:

`ifndef MY_DEFINES 
    `define MY_DEFINES 
    `define TYPEDEF_VECTOR_T typedef logic [WIDTH-1:0] vector_t; 
`endif 

//mod_sub.sv:

`include "defines.sv" 
module mod_sub #(parameter WIDTH = 32); 
... 
    `TYPEDEF_VECTOR_T 
    vector_t some_reg; 
... 
endmodule 

//mod_top.sv:

module mod_top; 

    mod_sub #(.WIDTH(8)) mod_sub8; 
    mod_sub #(.WIDTH(64)) mod_sub64; 

endmodule 

相信任何模塊,因而它們的內容不得早於系統的Verilog包闡述在編譯時通過參數修改。在你的代碼

`define SIMPLE_STRUCT(NAME) \ 
    simple_struct_t_``NAME`` 

`define SIMPLE_STRUCT_DEF(NAME, ADDR_MSB, DATA_MSB) \ 
typedef struct { \ 
     logic [ADDR_MSB``:0] address; \ 
     logic [DATA_MSB:0] data; \ 
    } `SIMPLE_STRUCT(NAME) 

然後,在一些地方,你可以定義結構(S),你需要:

4

你可以使用參數宏命名具有特定寬度的一個類型

`SIMPLE_STRUCT_DEF(narrow, 7, 31) 
`SIMPLE_STRUCT_DEF(wide, 15, 63) 

而且,然後用它無論你需要它,只用名:

`SIMPLE_STRUCT(narrow) narrow1, narrow2; 
narrow1.data = 0; 
narrow2 = narrow1; 
... 
0

我知道,這是一個很老的POS但現在我已經在這個問題上苦苦掙扎了一段時間了。我相信我找到了一個合適的解決方案,但我目前沒有工具集來驗證它是否可以成功合成。

詳見第5.6.7:http://www.sutherland-hdl.com/papers/2013-SNUG-SV_Synthesizable-SystemVerilog_paper.pdf

通過使用靜態函數靜態參數化類,可以調用在運行各種數據類型的不同的參數,並保持他們獨特的每個實例。

任何人都可以驗證這是一個可行的解決方案嗎?謝謝!

+0

這適用於Synopsys DC。我提出了一個支持請求,以便將其添加到Synplify中。 – nachum 2015-01-28 21:18:11

+0

我可以看到如何參數化函數參數,但是如何使用此解決方案來參數化結構? – Ari 2015-04-13 23:23:56