作者pierreqq (叶子上的风)
看板Electronics
标题Re: [问题] 关於verilog signal&varieble问题
时间Tue Apr 14 23:00:27 2009
※ 引述《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)