2012-04-05 37 views
1

我讀了IEEE標準的Verilog硬件描述語言(特別是IEEE標準1364-2001),它明確定義並討論可以模擬的Verilog。不幸的是,該文件沒有涉及合成的概念。明確的規則,以確定哪些Verilog的工具是綜合的

我一直沒能找到綜合的的Verilog類似的提法。我發現的只是模糊的規則,或者不必要的限制性規則。

我在哪裏可以學習可合成的Verilog的形式語言?

+2

我不認爲這是一個正式的定義。只有「合成器會接受什麼」,這在一個合成器和下一個合成器之間會有所不同。有些東西我非常確定*沒有*合成器會處理,而其他所有會合成的,以及一些灰色區域,其中一些將會,另一些不會,並且一些聲稱但不是完全可靠/無bug的灰色區域。 – 2012-04-05 16:27:51

回答

3

IEEE 1364.1是一種輔助的1364的Verilog標準標題Verilog Register Transfer Level Synthesis,它試圖確定一個共同的綜合的子集。但是,正如Jerry指出的那樣,不同的工具支持不同的構造,並且要確定特定於工具的行爲,您需要查閱工具文檔。

沒有一個正式的(BNF式)語法綜合的Verilog定義。代碼是否可綜合取決於使用情況以及語法。例如,由不完全靈敏度總是結構描述的行爲,如always @(a) o = a || b,是不可合成的。 (大多數工具將合成的代碼,就好像靈敏度列表是完全的,從而導致可能的模擬/合成失配。)

電路構造像鎖存器和乘驅動網可以從Verilog的描述來合成,但不允許或在大多數設計規則下不鼓勵。考慮到目標庫的選擇,還有不支持或不可取的可合成構造。例如,描述大於所選FPGA技術支持的最大值的RAM,或描述三態驅動程序不存在於目標庫中時的情況。

的一般構建體粘到用於合成的Verilog是:

  • 組合邏輯與連續分配(assign語句)建模
  • 組合邏輯建模與總是塊,其應該使用阻塞賦值,並且或者具有一個完整的靈敏度列表或者使用always @*
  • 時序邏輯(觸發器)與總是塊建模,這應該使用非阻塞賦值,並且單獨具有任一posedge時鐘(用於同步復位或非復位觸發器)或posedge時鐘和POS靈敏度列表中的邊緣或者網絡重置(用於異步重置觸發器)。

時序邏輯的最安全的編碼風格是隻對碼復位邏輯順序總是塊:

always @(posedge clk or posedge reset) 
    if (reset) 
    q <= reset_value; 
    else 
    q <= next_value; 

但是,如果你很小心,你可以在連續的塊代碼的其他組合邏輯。它可能是有意義的做這方面的一個常見的情況是在翻牌前的MUX:

always @(posedge clk) 
    if (!sel) 
    q <= sel0_value; 
    else if (sel) 
    q <= sel1_value; 
    else 
    q <= 'bx;