作者Aragom (清风阑夜起)
看板Electronics
标题Re: [问题] always与assign的问题
时间Tue Jan 2 12:50:30 2007
※ 引述《CuckooBoy (阿书)》之铭言:
: 请问一个简单的 C = A and B
: 可以用always与assign去写
: 请问两者差别为何 ?
: verilog 初学者,看过verilog的书了....
: 不过还是弄不清楚
: 不知到高手可以帮小弟解惑一下!!
: 你们应该会觉得这麽简单还问.......不要骂我>"<
always begin...end block 基本上有两种描述分别为
always @ (posedge clk) <--- edge trigger 电路,合成出暂存器
always @ (a or b or c) <--- event trigger 电路,合成出组合逻辑电路
ex.
1. always @ (a_in or b_in)
begin
sum = {1'b0, a_in} + {1'b0, b_in};
end
2. assign sum = {1'b0, a_in} + {1'b0, b_in};
以上两种写法都是合成出一个加法电路,assign的部份好理解就不说明
always的写法为啥在模拟的时候也是组合逻辑
简单的看,当always驱动事件中只要 a_in 以及 b_in 改变输出 sum 也改变
那这不就相同於组合逻辑电路中只要输入改变输出就会经过延迟後可能改变
这也就是为什麽写event trigger的时候sensitivity list一定要完整写出
若是a_in没有写在list中,模拟器并不会因为a_in改变连带让sum改变
然而,合成结果为一加法器,输入改变输出依然可能会改变
这就会造成所谓的模拟的mismatch
因此写成 always @ (event)/assign 都可以合成出组合逻辑电路
那为啥还要有 always block 的写法,因为case等叙述得活在always block中
所以学会使用always @ (event trigger)的写法还是很重要的
尤其是if/else, case中unconditional assignment以避免latch的产生是重点
以上的内容其实去上 CIC 的 Logic Synthesis with Design Compiler
王旭昇工程师都会很耐心的说明,包括Synthesizable Verilog HDL该节
初学者强烈建议去上上该门课,王工程师人很热血问题有问必答喔
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 218.162.108.175
1F:推 luckyBF:推 01/02 12:56
2F:→ acelp:诚心建议最近问题很多的某网友 认真把manual看完 01/02 13:16
3F:推 tkhan:我也想问 assign a=b and c 和 assign a=b & c有哪里不同 01/02 14:20
4F:推 DecadentX:推推推 01/03 00:02