作者zxvc (修行)
看板Electronics
標題[心得] HDL合成
時間Tue Apr 7 07:52:48 2009
一般我們都說Verilog中initial是"不能合成"的。
其是所謂的"不能合成",有兩種意義,一種是"不可能合成",
另一種是"合成器不支援"。
"不支援"比起"不可能"還有周旋餘地。
"不可能"把話說死了,即使未來的工藝技術(state of the art)
再怎麼進步都不可能合成出來的意思。
事上很多HDL語法僅僅只是當代的state of the art不支援罷了。
也沒人證明出哪一個HDL語法保證不可能合成。
但有standard規定哪些語法保證可合成,例如[1]:
IEEE 1364.1 Verilog register transfer level synthesis
我以前一直說initial語法不能合成。
今天我看IEEE 1364.1發現initial在某些情況下是可合成的。
例如以下這個範例[1](原始的code有點bug,我稍微修改了一下):
~~~~~~~~~~~~~~~~~~~~~~~rom_2dimarray_initial.v~~~~~~~~~~~~~~~~
module rom_2dimarray_initial (
output wire [3:0] z,
input wire [2:0] a);
reg [3:0] rom[7:0];
initial begin
rom[0] = 4'b1011;
rom[1] = 4'b0001;
rom[2] = 4'b0011;
rom[3] = 4'b0010;
rom[4] = 4'b1110;
rom[5] = 4'b0111;
rom[6] = 4'b0101;
rom[7] = 4'b0100;
end
assign z = rom[a];
endmodule
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
這在Xilinx ISE 8.2i是可以合成出來的。我跑過post-layout simulation也是正確的。
其實這code是在model一個ROM。
所以,說"當代合成器不支援某個語法",會比說"不能合成"的好。
因為"不能合成"有兩種意思。
[1] IEEE, "IEEE 1364.1 Verilog register transfer level synthesis,"
http://ieeexplore.ieee.org/Xplore/dynhome.jsp --
西方三聖:
http://p8.p.pixnet.net/albums/userpics/8/3/553683/1193661731.jpg 《佛說阿彌陀經》
http://web.cc.ncu.edu.tw/~93501025/amtf.doc 十一面觀音咒:
http://file.buda.idv.tw/music/DBZFY04.mp3 --
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.115.220.219
※ 編輯: zxvc 來自: 140.115.220.219 (04/07 07:53)
→ zxvc:其實說"大多數的合成器不能合成"也不錯,因為沒有把話說死。 04/07 07:56
→ M9407120:那應該算是書本的問題巴~時代會進步 04/07 08:39
→ M9407120:早期的書這樣寫並不算錯誤~現在幾乎都可以這樣合成了 04/07 08:39
→ horsehead:那是因為你用FPGA的緣故才能和成出initial 04/07 09:23
→ horsehead:如果今天你是在asic design flow 裡依然不行 04/07 09:24
→ horsehead:你想想看你所認識的邏輯閘有那些東西可以兜出initial 04/07 09:26
→ horsehead:FPGA因為他也算一顆ASIC 他有內部的RESET信號 04/07 09:26
→ horsehead:他是利用一開始的RESET去初始化 04/07 09:28
→ horsehead:所以並非是用邏輯閘去兜出來 04/07 09:29
→ horsehead:數位任何電路都是邏輯閘變成的 想想哪個邏輯閘可以和成 04/07 09:30
→ horsehead:該FUNCTION 就知道何不合理 04/07 09:31
推 lightnsalt:同意樓上。在學習HDL之前應加強對邏輯閘的認識。 04/07 10:51
推 pupucar:他寫的電路是單純的組合邏輯 應該沒有啥reset問題吧?! 04/07 14:26
→ pupucar:抱歉 沒看到REG 當我沒說 不過要寫ROM我也不會這樣寫 04/07 14:28
推 pupucar:囧 再修正一下 剛剛在ISE試過了是純組合邏輯沒錯 突然腦殘 04/07 14:38
→ zxvc:h大,ROM只是純combinational circuit,不需要reset訊號。 04/07 16:10
→ zxvc:我用Design Compiler 2004合成,的確有看到忽略initial的訊 04/07 16:12
→ zxvc:息。合成(compile)可以過,但最後的電路不是我要的ROM。 04/07 16:13
→ zxvc:initial在這種code所model的東西,並不是一個什麼初始化的 04/07 16:15
→ zxvc:電路。所以ISE可以合得出來,並不是因為它可以合你說的這種 04/07 16:17
→ zxvc:initial電路。而Design Compiler之所以不能合,我認為只是它 04/07 16:18
→ zxvc:不完全支援IEEE 1364.1。 04/07 16:19
→ zxvc:Design Compiler怎麼會笨到不能合ROM? 04/07 16:20
→ zxvc:只不過要用Design Compiler合ROM要用另外一種寫法。 04/07 16:21
→ zxvc:況且說我上面code可以合是IEEE 1364.1自己說可以合的 04/07 16:23
→ zxvc:IEEE 1364.1何必說一個不能合的code可以合呢? 04/07 16:24
→ zxvc:所以這只是Design Compiler 2004不支援IEEE 1364.1的標準。 04/07 16:24
推 horsehead:這邊非常抱歉 我沒看清楚你寫的code 04/07 16:29
→ horsehead:依你的設計模式和成一個ROM是OK的 04/07 16:29
→ horsehead:一開使我誤以為又有人要在暫存器上給初始值了 04/07 16:30
→ horsehead:所以是我誤會你了 這邊說聲抱歉 04/07 16:31
→ zxvc:h大,沒關係。不過這種寫法還是少寫為妙,我目前只有ISE合得 04/07 17:48
→ zxvc:出來ROM。其它都合出一些很怪的東西。 04/07 17:49
→ zxvc:Quartus II 9.0合出來的電路gate-level模擬結果是錯的。 04/07 17:50
→ zxvc:Design Compiler合出z訊號全是0。 04/07 17:53
→ zxvc:Cadence RTL Compiler也是忽略initial敘述。 04/07 17:54
推 proach:大部分的FPGA開電後,先把資料從SRAM/Flash搬移到cell內, 04/07 18:39
→ proach:所以可以指定每個bit的initial value 04/07 18:40
→ ksmrt0123:雖然initail合成rom看來只能在ise用, 我也不會這樣用, 04/07 20:20
→ ksmrt0123:但我大推這篇文章, 因為對tool有深入瞭解是成為好的 04/07 20:22
→ ksmrt0123:designer的必要條件 04/07 20:22
推 ksmrt0123:說個故事 某家design house的某顆chip, 用了不少由 04/07 20:37
→ ksmrt0123:memory compiler產生的sram blocks, 後來才發現 04/07 20:37
→ ksmrt0123:ower ring width是可以設定的 若設成跟競爭對手一樣寬, 04/07 20:37
→ ksmrt0123:die cost可減少好幾角NTD... 那顆chip是低價大量 04/07 20:37
→ ksmrt0123:的產品, 每顆差幾角, 一個月至少差好幾十萬 04/07 20:37
→ ksmrt0123:整個1-2年的life cycle就差好幾百萬了 04/07 20:38
→ ksmrt0123:因只是沒人仔細去study memory compiler的設定... 04/07 20:38
→ ksmrt0123:power ring width... 發現時已量產一段時間了... 04/07 20:39
→ zxvc:p大,ISE合出來的真的只是一個combinational的ROM。SRAM是 04/07 20:53
→ zxvc:sequantial circuit。 04/07 20:53
→ zxvc:這是ISE合出上面code的RTL schematic: 04/07 20:54