一….尽量不要运用大于小于这样的判别句子, 这样会明显添加运用的逻辑单元数量 .看一下陈述,资源运用不同很大.
例程:always@(posedge clk) begin count1=count1+1; if(count1==10000000) feng=1; //no_ring else if(count1==90000000) begin feng=0; //ring count1=0; endend //这么写会用107个逻辑单元
// 假如把这句话if(count1==10000000)改成大于小于,陈述中用了135个逻辑单元
二…..一定要想尽办法削减reg寄存器的长度
前次把[30:0]改到[50:0],陈述里逻辑单元从100多直升到2000多!!!太吓人了,至于为什么我就不知道了哈!
三….case句子里一定要加default if一定要加else
假如是组合逻辑的规划,不加default或else的话,不能确保一切的状况都有赋值,就会在内部构成一个锁存器,不再是一个朴实的组合逻辑了,电路功能就会下降.
例如:case({a,b})
2b11 e=b;
2b10 e=a;
endcase
//不加default,尽管只关怀a=1时的成果,可是a=0的时分,e就会保存本来的值,直到a变为1
//那么e要保存本来的值,就要在内部生成锁存器了.
四….尽量运用Case句子 而不是if–else句子
杂乱的if–else句子通常会生成优先级译码逻辑,这将会添加这些途径上的组合时延用来发生杂乱逻辑的Case句子通常会生成不会有太多时延的并行逻辑
五…组合逻辑的always块中,要留意一切的输入悉数放入灵敏变量表里
比方:always@(a or b)
begin
out=(abc);
end
此刻生成的不是纯的组合逻辑,由于当C改变时, out不会马上发生改变(需求比及a或b改变,c的改变才会闪现), 所以需求生成一个寄存器来保存C的值.
接连赋值句子的归纳:从赋值句子右边提取出逻辑,用于驱动赋值句子左面的net
进程赋值句子的归纳:从赋值句子右边提取出的逻辑,用于驱动赋值句子左面的reg型变量。留意:iniTIa句子仅用于仿真,不归纳。只要在always中才干被归纳。
主张组合逻辑用堵塞句子,时序逻辑用非堵塞句子,任何延时操控(如#5)都被归纳东西器疏忽。一个模块中同一个变量不能既有堵塞赋值,又有非堵塞赋值。
always句子的归纳
1关于组合逻辑,事情列表有必要包含一切always句子中引证的变量,否则会形成归纳的成果与规划功能不匹配。
2暂时变量能够不用在事情列表中列出。
if句子的归纳
特别要留意归纳出锁存器。always中,某个变量没有在一切的条件分支中被赋值,就会归纳出锁存器。
case句子归纳
和if句子相同,不完整的case分支句子也会导致锁存器的归纳。
防止办法:
1)在case句子前,对要赋值的变量赋予初值
always @ (state or a or b) begin
q =0;
case(state)
3b000: q = A B;
……
2)运用default分支句子
3)运用归纳指令,详细用法在case关键字行的注释中刺进”synthesis full_case“
并行CASE句子
通常状况下case句子和if句子相同会归纳出代有优先权解码的硬件电路,从上大侠选项优先级逐步下降。但假如规划者知道case句子中的一切项是互斥的,这时分就运用”parallel_case归纳指令。
always @(key)
case(key) //synthesis parallel_case
4b0001: a = 0;
endcase