我讀了IEEE標準的Verilog硬件描述語言(特別是IEEE標準1364-2001),它明確定義並討論可以模擬的Verilog。不幸的是,該文件沒有涉及合成的概念。明確的規則,以確定哪些Verilog的工具是綜合的
我一直沒能找到綜合的的Verilog類似的提法。我發現的只是模糊的規則,或者不必要的限制性規則。
我在哪裏可以學習可合成的Verilog的形式語言?
我讀了IEEE標準的Verilog硬件描述語言(特別是IEEE標準1364-2001),它明確定義並討論可以模擬的Verilog。不幸的是,該文件沒有涉及合成的概念。明確的規則,以確定哪些Verilog的工具是綜合的
我一直沒能找到綜合的的Verilog類似的提法。我發現的只是模糊的規則,或者不必要的限制性規則。
我在哪裏可以學習可合成的Verilog的形式語言?
IEEE 1364.1是一種輔助的1364的Verilog標準標題Verilog Register Transfer Level Synthesis,它試圖確定一個共同的綜合的子集。但是,正如Jerry指出的那樣,不同的工具支持不同的構造,並且要確定特定於工具的行爲,您需要查閱工具文檔。
沒有一個正式的(BNF式)語法綜合的Verilog定義。代碼是否可綜合取決於使用情況以及語法。例如,由不完全靈敏度總是結構描述的行爲,如always @(a) o = a || b
,是不可合成的。 (大多數工具將合成的代碼,就好像靈敏度列表是完全的,從而導致可能的模擬/合成失配。)
電路構造像鎖存器和乘驅動網可以從Verilog的描述來合成,但不允許或在大多數設計規則下不鼓勵。考慮到目標庫的選擇,還有不支持或不可取的可合成構造。例如,描述大於所選FPGA技術支持的最大值的RAM,或描述三態驅動程序不存在於目標庫中時的情況。
的一般構建體粘到用於合成的Verilog是:
assign
語句)建模always @*
時序邏輯的最安全的編碼風格是隻對碼復位邏輯順序總是塊:
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;
我不認爲這是一個正式的定義。只有「合成器會接受什麼」,這在一個合成器和下一個合成器之間會有所不同。有些東西我非常確定*沒有*合成器會處理,而其他所有會合成的,以及一些灰色區域,其中一些將會,另一些不會,並且一些聲稱但不是完全可靠/無bug的灰色區域。 – 2012-04-05 16:27:51