作者zxvc (执着)
看板Electronics
标题Re: [问题] 一些verilog的问题...
时间Fri Jan 1 12:24:15 2010
※ 引述《WizardRush (插很大)》之铭言:
: 我知道<=都代表同步更新
: 但如果像这样呢:
: always@(posedge clk) begin
: A = B;
: C <= D;
: end
: always@(posedge clk) begin
: E <= F;
: G = H;
: end
: 这四条的先後顺序还是A先再来C、E一起然後G吗?
: -----------------------------------------------
: 一个always里面,不能同时存在=和<=,跑一下simulation,
: tool应该会告诉你有error吧!
这两句话不太正确,HDL simulator可以允许一个sequential block
同时使用nonblocking与blocking assignments。
会出问题的地方是在,大多数(可能全部)的synthesizer无法合成出
同时使用nonblocking与blocking assignments的always的电路。
我想是因为这样描述的logic太复杂、难懂,所以synthesizer乾脆不支援。
我觉得不要把nonblocking看作"同步更新",
nonblocking指的是"assign值到左手边的动作(update)"先暂停,
然後继续计算後面的HDL code,直到遇到blocking assignement或end,
才作assign到左手边的动作(update)。
所以nonblocking与blocking assignments最大的差别是,
nonblocking assignment不会阻挡(block) HDL code执行控制权的运作,
然後执行它的update动作。
但blocking assignment会,会block直到它update完毕。
补充一点:
一个assignment可以细分成两个动作:evaluate、update。
一个是等号右手边的evaluate动作,另一个是assign到等号左手边的update动作。
: 再来一个电路里面本来就会有critical path,他会决定你一
: 个周期至少需要多少,不是你做了某些改良,critical path
: 就会消失..
: 另外你又问了很多谁跑得比较快的问题,那我想请问一下你是
: 怎麽定义快或是慢呢?是指谁的gate delay比较大的意思吗?
: 你要不要先思考一下你的问题到底是...?
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 220.139.204.14
※ 编辑: zxvc 来自: 220.139.204.14 (01/01 12:25)
1F:→ ksmrt0123:刚用quartus试, 合成两种assignment都有的always电路 01/01 21:12
2F:→ ksmrt0123:没什麽问题 01/01 21:12
3F:→ ksmrt0123:其实应该不会合不出来 只是合出来的电路常与预期的不同 01/01 21:15
4F:→ ksmrt0123:只要保持良好的coding style, 就不需去烦恼这些问题了 01/01 21:16