作者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)
1F:→ zxvc:其实说"大多数的合成器不能合成"也不错,因为没有把话说死。 04/07 07:56
2F:→ M9407120:那应该算是书本的问题巴~时代会进步 04/07 08:39
3F:→ M9407120:早期的书这样写并不算错误~现在几乎都可以这样合成了 04/07 08:39
4F:→ horsehead:那是因为你用FPGA的缘故才能和成出initial 04/07 09:23
5F:→ horsehead:如果今天你是在asic design flow 里依然不行 04/07 09:24
6F:→ horsehead:你想想看你所认识的逻辑闸有那些东西可以兜出initial 04/07 09:26
7F:→ horsehead:FPGA因为他也算一颗ASIC 他有内部的RESET信号 04/07 09:26
8F:→ horsehead:他是利用一开始的RESET去初始化 04/07 09:28
9F:→ horsehead:所以并非是用逻辑闸去兜出来 04/07 09:29
10F:→ horsehead:数位任何电路都是逻辑闸变成的 想想哪个逻辑闸可以和成 04/07 09:30
11F:→ horsehead:该FUNCTION 就知道何不合理 04/07 09:31
12F:推 lightnsalt:同意楼上。在学习HDL之前应加强对逻辑闸的认识。 04/07 10:51
13F:推 pupucar:他写的电路是单纯的组合逻辑 应该没有啥reset问题吧?! 04/07 14:26
14F:→ pupucar:抱歉 没看到REG 当我没说 不过要写ROM我也不会这样写 04/07 14:28
15F:推 pupucar:囧 再修正一下 刚刚在ISE试过了是纯组合逻辑没错 突然脑残 04/07 14:38
16F:→ zxvc:h大,ROM只是纯combinational circuit,不需要reset讯号。 04/07 16:10
17F:→ zxvc:我用Design Compiler 2004合成,的确有看到忽略initial的讯 04/07 16:12
18F:→ zxvc:息。合成(compile)可以过,但最後的电路不是我要的ROM。 04/07 16:13
19F:→ zxvc:initial在这种code所model的东西,并不是一个什麽初始化的 04/07 16:15
20F:→ zxvc:电路。所以ISE可以合得出来,并不是因为它可以合你说的这种 04/07 16:17
21F:→ zxvc:initial电路。而Design Compiler之所以不能合,我认为只是它 04/07 16:18
22F:→ zxvc:不完全支援IEEE 1364.1。 04/07 16:19
23F:→ zxvc:Design Compiler怎麽会笨到不能合ROM? 04/07 16:20
24F:→ zxvc:只不过要用Design Compiler合ROM要用另外一种写法。 04/07 16:21
25F:→ zxvc:况且说我上面code可以合是IEEE 1364.1自己说可以合的 04/07 16:23
26F:→ zxvc:IEEE 1364.1何必说一个不能合的code可以合呢? 04/07 16:24
27F:→ zxvc:所以这只是Design Compiler 2004不支援IEEE 1364.1的标准。 04/07 16:24
28F:推 horsehead:这边非常抱歉 我没看清楚你写的code 04/07 16:29
29F:→ horsehead:依你的设计模式和成一个ROM是OK的 04/07 16:29
30F:→ horsehead:一开使我误以为又有人要在暂存器上给初始值了 04/07 16:30
31F:→ horsehead:所以是我误会你了 这边说声抱歉 04/07 16:31
32F:→ zxvc:h大,没关系。不过这种写法还是少写为妙,我目前只有ISE合得 04/07 17:48
33F:→ zxvc:出来ROM。其它都合出一些很怪的东西。 04/07 17:49
34F:→ zxvc:Quartus II 9.0合出来的电路gate-level模拟结果是错的。 04/07 17:50
35F:→ zxvc:Design Compiler合出z讯号全是0。 04/07 17:53
36F:→ zxvc:Cadence RTL Compiler也是忽略initial叙述。 04/07 17:54
37F:推 proach:大部分的FPGA开电後,先把资料从SRAM/Flash搬移到cell内, 04/07 18:39
38F:→ proach:所以可以指定每个bit的initial value 04/07 18:40
39F:→ ksmrt0123:虽然initail合成rom看来只能在ise用, 我也不会这样用, 04/07 20:20
40F:→ ksmrt0123:但我大推这篇文章, 因为对tool有深入了解是成为好的 04/07 20:22
41F:→ ksmrt0123:designer的必要条件 04/07 20:22
42F:推 ksmrt0123:说个故事 某家design house的某颗chip, 用了不少由 04/07 20:37
43F:→ ksmrt0123:memory compiler产生的sram blocks, 後来才发现 04/07 20:37
44F:→ ksmrt0123:ower ring width是可以设定的 若设成跟竞争对手一样宽, 04/07 20:37
45F:→ ksmrt0123:die cost可减少好几角NTD... 那颗chip是低价大量 04/07 20:37
46F:→ ksmrt0123:的产品, 每颗差几角, 一个月至少差好几十万 04/07 20:37
47F:→ ksmrt0123:整个1-2年的life cycle就差好几百万了 04/07 20:38
48F:→ ksmrt0123:因只是没人仔细去study memory compiler的设定... 04/07 20:38
49F:→ ksmrt0123:power ring width... 发现时已量产一段时间了... 04/07 20:39
50F:→ zxvc:p大,ISE合出来的真的只是一个combinational的ROM。SRAM是 04/07 20:53
51F:→ zxvc:sequantial circuit。 04/07 20:53
52F:→ zxvc:这是ISE合出上面code的RTL schematic: 04/07 20:54