2013-12-09 84 views
1

我試圖生成一個使用Generate語句彼此相鄰放置的鎖存器數組。我一直在嘗試使用賽靈思約束「RLOC」來做到這一點,但我一直沒有成功。生成語句的Verilog放置約束

下面的代碼將不會成功實現,但應該說明我想要獲得什麼。下面的代碼的問題是約束調用中的「i」沒有被轉換爲一個字符串,這是該調用正在尋找的內容。有沒有人有這樣的經驗?

我正在使用Virtex4和Xilinx ISE 10.1.03進行綜合和實現。我不完全確定我使用的Verilog版本,但我認爲它是Verilog 2001.如果有人也可以告訴我如何檢查我使用的Verilog版本,我將不勝感激。

genvar i; 
    generate 
    for (i = 0; i < DATA_WIDTH; i = i + 1) 
    begin : LATCH 
     (* RLOC = {"X0Y", i} *) 
     latch inst_latch (
     .d  (data_in[i]), 
     .gate  (gate), 
     .reset (reset), 
     .q  (data_out[i]) 
    ); 
    end 
    endgenerate 
+0

我不認爲你可以用直接的verilog來完成這個任務。我會建議在perl或您選擇的語言中編寫腳本來創建一個verilog文件。如果我有時間,我會自己嘗試這個,並且如果我想出成功的代碼,就可以回答這個問題。 – nguthrie

回答

0

我最終使用參數化宏來將傳遞給RLOC的字符串替換爲生成變量。這是一個很好的解決辦法,而且如果我早點看過,我很可能會使用Greg的解決方案。

無論如何,如果人們真正感興趣的,宏:

parameter DIGITS = ""; 

`define THOUSANDS(x) (x/1000) 
`define HUNDREDS(x) ((x - (`THOUSANDS(x) * 1000))/100) 
`define  TENS(x) ((x - (`THOUSANDS(x) * 1000) - (`HUNDREDS(x) * 100))/10) 
`define  ONES(x) (x - (`THOUSANDS(x) * 1000) - (`HUNDREDS(x) * 100) - (`TENS(x) * 10)) 

`define  TO_STRING(x) (DIGITS[((8 * (x + 1)) - 1) : (8 * x)]) 
`define VAR_TO_STRING(x) ({`TO_STRING(`THOUSANDS(x)), `TO_STRING(`HUNDREDS(x)), `TO_STRING(`TENS(x)), `TO_STRING(`ONES(x))}) 

宏千種(),百(),TENS(),和一()返回十萬,幾百個,幾十號,以及在x中找到的。這些宏應始終返回1個數字值。

TO_STRING()需要一些數字值,並通過返回參數DIGITS的一部分將其「轉換」爲字符串。

VAR_TO_STRING()使用上述所有宏來將任何4位數的整數轉換爲其字符串等效項。問題中的代碼將被替換爲:

genvar i; 
generate 
    for (i = 0; i < DATA_WIDTH; i = i + 1) 
    begin : LATCH 
    (* RLOC = {"X0Y", `VAR_TO_STRING(i)} *) 
    latch inst_latch (
     .d  (data_in[i]), 
     .gate  (gate), 
     .reset (reset), 
     .q  (data_out[i]) 
    ); 
    end 
endgenerate 
1

我猜,賽靈思公司處理{"X0Y", i}爲文字,而不是評價它。您可以使用腳本來處理您的代。您可以讓您的首選編程生成的代碼在verilog文件中使用`include語句。

概念是一樣的,只是用於轉換的嵌入式語言和工具的區別。

不利的一面是腳本不會將DATA_WIDTH作爲變量/參數。你必須傳遞一個數字常量或找到一些奇妙的方式來傳遞值。