2010-03-02 208 views
1

我習慣於開發很多測試平臺,並用於()和while()循環來進行測試。沒關係。問題是,我已經習慣於編碼可以合成的電路。 XST和他人拒絕合成代碼(沒有附加修改合成參數),諸如:如何在verilog中使用while()循環(用於綜合)?

while (num < test_number) 
    begin 
    . 
    . 
    . 
    num = num+1; 
    end 

這是壞的編碼風格,因爲到合成test_num是具有值2^32的int!或者它將其視爲無界參數。無論哪種方式,它都是一種糟糕的編碼習慣。但我很習慣在C和testbenches中做這個。上述代碼段的代碼可以等效合成多少?

謝謝!

+1

取決於你在做什麼。你的'while'循環中通常有什麼? – Marty

+0

它是一套加法和除法,然後是對計數器的更新。 –

回答

1

你需要有一個時鐘來控制它啓動。

always @(posedge clk or negedge rst_n) 
    if (!rst_n) 
    num <= 32'b0; // or whatever your width is. 
    else 
    if (num < test_number) 
     num <= num + 1'b1; 
+0

這似乎是一個很好的解決方案。但while()循環最初是在一個任務中。如果我通過時鐘來完成任務,它似乎不會更新它的值。但是,等一下,如果我正在使用任務,我是否甚至需要一個clk端口來完成任務,或者我可以使用clk而不將它作爲參數傳遞? –

+1

任務和函數可以訪問與任務在同一模塊中聲明的變量,輸入和輸出。當任務開始時,參數按值傳遞到任務和函數中(即通過複製)。輸出參數在任務存在時被複製出來。因此,不要將時鐘傳遞給任務。 –

1

如果您的綜合工具不支持whilefor循環,那麼就不要使用一個循環。只是擴展你的代碼。

wire [1:0] addr; 
reg [3:0] wren; 

always @(posedge clk) begin 
    wren[0] <= (addr == 2'd0); 
    wren[1] <= (addr == 2'd1); 
    wren[2] <= (addr == 2'd2); 
    wren[3] <= (addr == 2'd3); 
end 

我不熟悉XST,但是一些綜合工具支持循環(例如Synopsys)。

+1

我知道XST會允許循環,但它對迭代次數有限制。 Mine被設置爲一個保守的64.你當然可以改變這個限制,但是如果有一個100+迭代的綜合循環,即使允許它也不是一個好主意。 什麼是DC對迭代次數的默認限制。如果你想使用while()或for()進行綜合,它會使你感覺溫暖嗎? –

+0

我知道DC允許'for'循環。我從來沒有嘗試過綜合while循環,但文檔中有幾個可綜合的while循環的例子。我不知道迭代的限制是什麼。 – toolic

+0

-1建議DRY破壞(不必要的) – Earlz

3

綜合工具有所不同,但通常只要合成工具知道迭代次數,就可以合成一個循環。所以,

for (i = 0; i < 10; i = i + 1) 

是可以的,因爲該工具知道有10個循環迭代。但是

reg [10:0] r; 
for (i = 0; i < r; i = i + 1) 

不正確,因爲r是變量r的值在合成時是未知的。

將RTL代碼中的循環考慮爲創建一個邏輯塊的已知固定數量的副本。