一:基本
EDA中国门户网站SGF[@T&HVerilog中的变量有线网类型和寄存器类型。线网型变量综合成wire,而寄存器可能综合成WIRE,锁存器和触发器。
EDA中国门户网站[_8d;V/F/jvU*zg%U_2h0二:verilog语句结构到门级的映射
-zK} MzEL
?H/G,[({01、连续性赋值:assign
BKBGe
J V0连续性赋值语句逻辑结构上就是将等式右边的驱动左边的结点。因些连续性赋值的目标结点总是综合成由组合逻辑驱动的结点。Assign语句中的延时综合时都将忽视。
EDA中国门户网站3ERBi;HC)Fv1H)k1z*C3a[J02、过程性赋值:
$M\5k`.J0过程性赋值只出现在always语句中。
EDA中国门户网站3^Od+O6m~'IN)R)|,_J3M9{w V0阻塞赋值和非阻塞赋值就该赋值本身是没有区别的,只是对后面的语句有不同的影响。
EDA中国门户网站vHyu6B^'zE~U
Oye0建议设计组合逻辑电路时用阻塞赋值,设计时序电路时用非阻塞赋值。
,I"S'm`3E
^0EDA中国门户网站%U/qXX4^1G{V-vm过程性赋值的赋值对象有可能综合成wire,latch,和flip-flop,取决于具体状况。如,时钟控制下的非阻塞赋值综合成flip-flop。
EDA中国门户网站H@.T {0ir\EDA中国门户网站h-Vx;X5}l{4A0sR过程性赋值语句中的任何延时在综合时都将忽略。
C*a Q!c]08S+B%`PX.dL0建议同一个变量单一地使用阻塞或者非阻塞赋值。
EDA中国门户网站W)Vw&l_i6T0h
ekSn7Idd03、逻辑操作符:
9xv
t
Zo0J/R0逻辑操作符对应于硬件中已有的逻辑门
;tA0|;oO;q S?0 o:l!Z0S R:d04、算术操作符:
L:RGN9Q;e'H-wh)ID0Verilog中将reg视为有符号数,而integer视为有符号数。因此,进行有符号操作时使用integer,使用无符号操作时使用reg。
*L;u*R$X/d e:W0Ml0EDA中国门户网站M
Xb8j5X4fX5、进位:
4Zg3{1~"mO"WfE N,T
X0通常会将进行运算操作的结果比原操作数扩展一位,用来存放进位或者借位。如:
EDA中国门户网站&Gj9OF[,R,L}&eWire [3:0] A,B;
EDA中国门户网站k8pSI9W'N.pWire [4:0] C;
~a0W
AC8rgX0Assign C=A+B;
EDA中国门户网站vMQq$ND0P$bC的最高位用来存放进位。
5` jS7f9`3l5h0EDA中国门户网站J2J["p+FpQ6、关系运算符:
EDA中国门户网站d,lP\!s'p9I关系运算符:<,>,<=,>=
:TFzJ^ Y4i_h0和算术操作符一样,可以进行有符号和无符号运算,取决于数据类型是reg ,net还是integer。
5I{i$f @/Z0qUJD(`t c07、相等运算符:==,!=
EDA中国门户网站2ugH/]6r$N$b$y注意:===和!==是不可综合的。
EDA中国门户网站%Mk1}l}&ta"DZ可以进行有符号或无符号操作,取决于数据类型
g+V/H&lK0KL3as0EDA中国门户网站0rP3f
f&E9K.A
N8、移位运算符:
EDA中国门户网站 paQ9`)~o
f左移,右移,右边操作数可以是常数或者是变量,二者综合出来的结果不同。
8D
V|
B8Ns w3D1j0&cS:Hb[P09、部分选择:
EDA中国门户网站-r6W)Hq?4I部分选择索引必须是常量。
EDA中国门户网站
g0__6x*Pz]gEDA中国门户网站X(b.oAK"m^0u-i10、BIT选择:
!|5?.a/R8I:UZO*~2~0BIT选择中的索引可以用变量,这样将综合成多路(复用)器。
EDA中国门户网站!v8n~t(H/y11、敏感表:
EDA中国门户网站faTRL mxAlways过程中,所有被读取的数据,即等号右边的变量都要应放在敏感表中,不然,综合时不能正确地映射到所用的门。
"lP
o!H
h T-t|6l{n0EDA中国门户网站G/v"o^ `K@Ml5H12、IF:
EDA中国门户网站@-Zo3O4Q Q+_如果变量没有在IF语句的每个分支中进行赋值,将会产生latch。如果IF语句中产生了latch,则IF的条件中最好不要用到算术操作。Case语句类似。Case的条款可以是变量。
Z'h.WU:tNo0cbosUh0如果一个变量在同一个IF条件分支中先赎值然后读取,则不会产生latch。如果先读取,后赎值,则会产生latch。
*h3wy5q@0EDA中国门户网站!J&_9L^$K13、循环:
EDA中国门户网站pd:J8{EQ1P%~u只有for-loop语句是可以综合的。
E1}\kp)[G#ga0r0q~4aC7e9O*Sk
x;H014、设计时序电路时,建议变量在always语句中赋值,而在该always语句外使用,使综合时能准确地匹配。建议不要使用局部变量。
5aK3B)i.y0kCf,Zb015、不能在多个always块中对同一个变量赎值
I
O5M1Ft0EDA中国门户网站 BG{;EpP!F16、函数
EDA中国门户网站N;|6MQ#o函数代表一个组合逻辑,所有内部定义的变量都是临时的,这些变量综合后为wire。
EDA中国门户网站(N1jAs5l!d {+U0w5TEDA中国门户网站~G!jBW~x17、任务:
,lt4g4X)c Aw#o0任务可能是组合逻辑或者时序逻辑,取决于何种情况下调用任务。
]}k4V]#h,j2d8j F0EDA中国门户网站"L8faP3~18、Z:
FW
cKY2AO0Z会综合成一个三态门,必须在条件语句中赋值
/P!F)@9u4D{3V:r0
[aG4j8nr8g5pw019、参数化设计:
EDA中国门户网站Te2l)Bp*^9]优点:参数可重载,不需要多次定义模块
G+h)V%r(Ni6x0EDA中国门户网站$\c0QPT%x四:模块优化
1wLxy
W(z
D01、资源共享:
EDA中国门户网站W8e&yJ ~;UR(F当进程涉及到共用ALU时,要考虑资源分配问题。可以共享的操作符主要有:关系操作符、加减乘除操作符。通常乘和加不共用ALU,乘除通常在其内部共用。
6w5sL`9R~.B8d0EDA中国门户网站[%HAK!]7{2、共用表达式:
EDA中国门户网站*M(WT7c1y9G"pXk8v如:C=A+B;
]C5jUl\
^f0D=G+(A+B);
M5p_Y9F p0两者虽然有共用的A+B,但是有些综合工具不能识别.可以将第二句改为:D=G+C;这样只需两个加法器.
EDA中国门户网站6B3U
jdJvaJEx.YO/R03、转移代码:
hWp}5CL
Np j0如循环语句中没有发生变化的语句移出循环.
EDA中国门户网站4ZN^[Be&F;xA:@2Q
~qudQS I04、避免latch:
EDA中国门户网站(CI$rm*j_.Y两种方法:1、在每一个IF分支中对变量赋值。2、在每一个IF语句中都对变量赋初值。
B{1P0[
f4n0EDA中国门户网站Sn8vy0F&O5:模块:
EDA中国门户网站7AM-z8[7d}mb综合生成的存储器如ROM或RAM不是一种好方法。最好用库自带的存储器模块。
y
v,mOT0!Xf#g2a!U
pQ3P0五、
验证:
$L
Bm5MAD+?Y"|01、敏感表:
EDA中国门户网站,n)s&~Lz ?KHl在always语句中,如果敏感表不含时钟,最好将所有的被读取的信号都放在敏感表中。
EDA中国门户网站V8W"K7uR LEDA中国门户网站!~Brx,k!MF2Xo2、异步复位:
EDA中国门户网站w$y0}e(|*v}建议不要在异步时对变量读取,即异步复位时,对信号赎以常数值。