Electronics 板


LINE

※ 引述《zxvc (修行)》之铭言: : 我是习惯这种coding style。 : 或许你以为这样就是分开sequential circuit与combinational circuit, : module Test(c, d, Clock, Reset1); : output reg [2:0] c; : output reg d; : input Clock, Reset1; : reg d2; : always@(posedge Clock) : if(Reset1) : c = 0; : else : begin : c = c+1; : d = d2; : end : always@(*) : if(c == 2) : d2 = 1; : else : d2 = 0; : endmodule : 但其实c = c+1;会合出加法器(combinational circuit)。 : 所以这种叙述也是bad style!?: : always@(posedge Clock) : if(Reset1) : a = 0; : else : begin : if(b) : a = 1; : else : a = 0; : end : 因为if(b)会合出多工器。 : 如果这真是你们实验室的coding style,我也认了。 : 不过我没有轻视任何coding style的意思,只是习惯的差异。 : 至於debug的容易与否我想跟你自己习惯的coding style有关。 : 你自己习惯哪种coding style,你就觉得它容易debug。 : 不过如果大多数人的coding style跟我不一样, : 我想我也只好习惯别人的coding style。 : 题外话:这个世界不是最好的东西就是最好,还要大家说最好才算数。 我的习惯也是不会刻意去分开成两个 always,但是 仔细想一想吧,多写一些code就会体会把 always @(*) , always @(posedge ...) 分开的好处 最明显的是用在 FSM 上, 虽然也可以都写在一块... 例, always @(*) begin a = 1; b = 0; c =1; if ( S == 1 ) a = 0; if ( S == 2 ) b = 1; if ( S == 3 ) c = 0; end always @( posedge clk ) begin a_r <= a; b_r <= b; c_r <= c; end 你可以试着把他写成一个 always @( posedge ... ) 看看, 会不会比较好阅读 这个例子的电路有点简单, 直接分开成 三个 always @( posedge ... ) 反而更好, 当然我的用意不是这样,希望你可以理解 如果举的例子是 a~z 呢? 那每个 if 都要连贯, if 内要有 a~z 的描述... 应该会乱掉吧 ===================================================================== 另外,如果今天我要改设计,想拿掉 c_r register呢? 变 wire out 呢? : initial : begin : a = 0; (1) : a <= 1; (2) : b = 0; (3) : c <= a; (4) : end : (2)跟(4)如果视为同时动作,所以最後a = 1, c = 0!?就错了。 : 硬要用"同时"、"不同时"去解释也解释不通这initial怎麽跑。 : blocking assignment中block作动词解释为"阻挡",不是"方块"。 : 阻挡什麽?答案是执行的控制权。 : 也就是当assignment的update动作还没完成,它是不会执行下一行的。 : begin...end在Verilog中叫sequential block, : 也就它里面的叙述是一行一行(sequential)执行的(IEEE 1364-2005 Sec. 9.8.1)。 : fork...join在Verilog中叫parallel block, : 它里面的各叙述才是同时(concurrent)执行的(IEEE 1364-2005 Sec. 9.8.2)。 : 所以上面的initial要怎麽跑?答案就是,initial後面接sequential block, : 所以它会先执行(1)。(1)是blocking assignment, : 所以它会先对等号右手端求值(evaluation),然後更新(update)完a才继续执行下一行。 : 所以现在a = 0,然後执行(2)。(2)是non-blocking assignment,它会先evaluation, : 但不会立即update就执行下一行(3)。 : non-blocking assignment update的动作是当 : 遇到blocking assignment或sequential block的end才会update。 : (3)是blocking assignment,所以a会被强制update。所以(3)执行完後 : a = 1, b = 0。 : 接着执行(4),但a此时=1,所以最後a = 1, b = 0, c = 1。 : 有兴趣可以用ModelSim验证看看。 : 另外请勿使用parallel block(fork...join)设计硬体, : 因为大多合成器不能合成。 基本上你initial, fork join都是simulation的用法,是不能合成的 还有 non-blocking, blocking 最好不要一起用,很有趣,但没多少人看的懂, 连simulator都可能有不同解释 --



※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 61.64.79.59 ※ 编辑: pierreqq 来自: 61.64.79.59 (04/14 23:17)
1F:推 zxvc:non-blocking跟blocking的scheduling问题,IEEE 1364都定得很 04/15 06:29
2F:→ zxvc:清楚,它们也不很冷门的语法。我用过的simulator都有一致的 04/15 06:33
3F:→ zxvc:结果。不过难懂倒是有点如此,所以即使是testbench也不建议 04/15 06:34
4F:→ zxvc:混着用。要看懂它,还必需先了解scheduling的观念,我想这是 04/15 06:37
5F:→ zxvc:一些人学HDL的一个障碍。不过我觉得学scheduling也不能去逃避 04/15 06:39
6F:→ zxvc:我最近在使用SystemC,许多意想不到的结果,仍然是不懂 04/15 06:40
7F:→ zxvc:它scheduling的问题。VHDL也有它自己的一套scheduling,像 04/15 06:41
8F:→ zxvc:它的signal跟variable是不一样的,很类似Verilog的 04/15 06:43
9F:→ zxvc:non-blocking与blocking assignment。 04/15 06:43
我的建议也是搞懂,但是不要刻意用, HDL 愈简单愈好, 因为flow的不同, 用的tool不尽相同, 会出什麽问题也不知道 Verilog虽然长的像C, 但是其实精神还是 HDL, 而编译器(synthesizer?)也不单纯 所以我是不太会去挑战tool的极限的 (有兴趣研究的人例外...)
10F:推 M9407120:没写过always(*),请问这是什麽意思??? 04/15 08:40
我好像打漏了 @, 补一下
11F:推 zxvc:这是用来model combinational circuits用的。 04/15 09:15
12F:推 pupucar:懒人用法in this case = a or b or c 04/15 09:16
13F:→ zxvc:(*)代表把所有inputs,以level sensitive加到sensitivity 04/15 09:16
14F:→ zxvc:list。这种写法的好处在於不必手动一个一个加。 04/15 09:17
15F:→ zxvc:手动加很容易漏掉一两个,这样behaviroal simulation的结果 04/15 09:18
16F:→ zxvc:就可能不是真正combinational circuits的结果。 04/15 09:18
17F:推 zxvc:这语法我当初也是在IEEE 1364看到的。 04/15 09:23
18F:→ zxvc:补充:何谓inputs。简单的说就是等号右手边的东西。左手边的 04/15 09:24
19F:→ zxvc:是outputs。 04/15 09:25
20F:推 M9407120:我明白了,谢谢 04/15 09:51
※ 编辑: pierreqq 来自: 211.78.167.166 (04/15 10:43)
21F:推 zxvc:p大,我觉得不要刻意去用的原因是因为难懂、没必要这麽用。 04/15 12:45
22F:→ zxvc:要不然一开始学Verilog时,你也不知道哪些语法可不可以用, 04/15 12:47
23F:推 zxvc:不是难的东西就代表每个tool有不一样的结果。 04/15 12:52
嗯,当然, 随着tools的更新,对scheduling的解读应该会趋向一致,这东西会愈用愈明白 只是之前遇上了, 而且这也不是正规写法,只好避开不用,对我之後的coding也没影响 因为写 HDL 重点不在这,就算我在 test bench 可以这样用, 但是为了别人阅读上的 方便,我也会尽量去写稳定不会出错的code 这就跟有人可以去参加比赛,写出最怪异的C,而且是有功能的,赢得冠军 但是教科书上绝对不会教你有这种写法的道理一样 ※ 编辑: pierreqq 来自: 211.78.167.166 (04/15 14:51)
24F:→ sneak: 它的signal跟va https://noxiv.com 11/11 15:04
25F:→ sneak: 它scheduling https://daxiv.com 01/04 21:55







like.gif 您可能会有兴趣的文章
icon.png[问题/行为] 猫晚上进房间会不会有憋尿问题
icon.pngRe: [闲聊] 选了错误的女孩成为魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一张
icon.png[心得] EMS高领长版毛衣.墨小楼MC1002
icon.png[分享] 丹龙隔热纸GE55+33+22
icon.png[问题] 清洗洗衣机
icon.png[寻物] 窗台下的空间
icon.png[闲聊] 双极の女神1 木魔爵
icon.png[售车] 新竹 1997 march 1297cc 白色 四门
icon.png[讨论] 能从照片感受到摄影者心情吗
icon.png[狂贺] 贺贺贺贺 贺!岛村卯月!总选举NO.1
icon.png[难过] 羡慕白皮肤的女生
icon.png阅读文章
icon.png[黑特]
icon.png[问题] SBK S1安装於安全帽位置
icon.png[分享] 旧woo100绝版开箱!!
icon.pngRe: [无言] 关於小包卫生纸
icon.png[开箱] E5-2683V3 RX480Strix 快睿C1 简单测试
icon.png[心得] 苍の海贼龙 地狱 执行者16PT
icon.png[售车] 1999年Virage iO 1.8EXi
icon.png[心得] 挑战33 LV10 狮子座pt solo
icon.png[闲聊] 手把手教你不被桶之新手主购教学
icon.png[分享] Civic Type R 量产版官方照无预警流出
icon.png[售车] Golf 4 2.0 银色 自排
icon.png[出售] Graco提篮汽座(有底座)2000元诚可议
icon.png[问题] 请问补牙材质掉了还能再补吗?(台中半年内
icon.png[问题] 44th 单曲 生写竟然都给重复的啊啊!
icon.png[心得] 华南红卡/icash 核卡
icon.png[问题] 拔牙矫正这样正常吗
icon.png[赠送] 老莫高业 初业 102年版
icon.png[情报] 三大行动支付 本季掀战火
icon.png[宝宝] 博客来Amos水蜡笔5/1特价五折
icon.pngRe: [心得] 新鲜人一些面试分享
icon.png[心得] 苍の海贼龙 地狱 麒麟25PT
icon.pngRe: [闲聊] (君の名は。雷慎入) 君名二创漫画翻译
icon.pngRe: [闲聊] OGN中场影片:失踪人口局 (英文字幕)
icon.png[问题] 台湾大哥大4G讯号差
icon.png[出售] [全国]全新千寻侘草LED灯, 水草

请输入看板名称,例如:Gossiping 或 站内搜寻

TOP