作者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)
→ ksmrt0123:剛用quartus試, 合成兩種assignment都有的always電路 01/01 21:12
→ ksmrt0123:沒什麼問題 01/01 21:12
→ ksmrt0123:其實應該不會合不出來 只是合出來的電路常與預期的不同 01/01 21:15
→ ksmrt0123:只要保持良好的coding style, 就不需去煩惱這些問題了 01/01 21:16