Verilog 语法知识2
5.顺序块(关键字begin and)
顺序块有以下特点:
- 块内的语句是按顺序执行的。
- 每条语句的延迟时间是相对于前一条语句的仿真时间而言的。
- 直到最后一条语句执行完,程序流程控制才跳出该语句块。
如:
begin
a = b;
c = a; //c的值为b的值。
end
即第一条赋值语句先执行,a的值更新为b的值,然后程序流程控制转到第二条赋值语句,c的值更新为a的值。因为这两条赋值语句之间没有任何延迟时间,c的值实为b的值。当然可以在顺序块里延迟控制时间来分开两个赋值语句的执行时间。
6.并行块(关键字fork join)
- 块内语句是同时执行的,即程序流程控制一进入到该并行块,块内语句则开始同时并行地执行。
- 块内每条语句的延迟时间是相对于程序流程控制进入到块内时的仿真时间的。
- 延迟时间是用来给赋值语句提供执行时序的。
- 当按时间时序排序在最后的语句执行完后或一个disable语句执行时,程序流程控制跳出该程序块。
如:
fork
#50 r = 'h35;
#100 r = 'hE2;
#150 r = 'h00;
#200 r = 'hF7;
#250 -> end_wave; //触发事件end_wave.
join //其执行的语句顺序可以随意改变
注意:#是指延时,上例的延时不同,就可以用顺序块来代替。在VerilgHDL语言中,可以给每个块取一个名字,只需将名字加在关键词begin或fork后面即可。这样可以在块内定义局部变量,即只在块内使用的变量,可以允许块被其它语句调用,如被disable语句。在Verilog语言里,所有的变量都是静态的,即所有的变量都只有一个唯一的存储地址,因此进入或跳出块并不影响存储在变量内的值。基于以上原因,块名就提供了一个在任何仿真时刻确认变量值的方法。
7.条件语句,(if_else)这个语句无论Verilog还是C语言都用的很多,但还是有需要注意的地方。
如:
if(a>b)
out1<=int1;
else if(a==b)
out1<=int2;
else
out1<=int3;
像这种里面只有一条语句,就不用加begin and,就和C语言一样不用加“{}”
而
if(a>b)
begin
out1<=int1;
out2<=int2;
end
else
begin
out1<=int2;
out2<=int1;
end
像这种,有多个语句的就需要加begin and。值得注意的是,if与else的配对关系,不要把自己嵌套糊涂了,这里有C语言基础的应该都懂,细节问题,不要逻辑混乱就行。
8.case语句,case语句是一种多分支选择语句,if语句只有两个分支可供选择,而实际问题中常常需要用到多分支选择,Verilog语言提供的case语句直接处理多分支选择。case语句通常用于微处理器的指令译码,和C语言不一样的是它后面还要搭配(endcase)而C语言是(break),这里就不细说了。
9.循环语句,在Verilog HDL中存在着四种类型的循环语句,用来控制执行语句的执行次数。 forever 连续的执行语句。 repeat 连续执行一条语句 n 次。 while 执行一条语句直到某个条件不满足。如果一开始条件即不满足(为假),则语句一次也不能被执行。for通过以下三个步骤来决定语句的循环执行。a先给控制循环次数的变量赋初值。b判定控制循环的表达式的值,如为假则跳出循环语句,如为真则执行指定的语句后,转到第三步。c 执行一条赋值语句来修正控制循环变量次数的变量的值,然后返回第二步。
- forever语句,格式:forever 语句; forever begin 多条语句 end
- repeat语句,格式:repeat(表达式) 语句;repeat(表达式) begin 多条语句 end
parameter size=8,longsize=16;
reg [size:1] opa, opb;
reg [longsize:1] result;
begin: mult//块名
reg [longsize:1] shift_opa, shift_opb;
shift_opa = opa;
shift_opb = opb;
result = 0;
repeat(size)//这里就是指重复次数size
begin
if(shift_opb[1])
result = result + shift_opa;
shift_opa = shift_opa <<1;
shift_opb = shift_opb >>1;
end
end//这个程序写的是一个乘法器,运用加法和移位来操作的。
- while语句:格式:while(表达式) 语句;while(表达式) begin 多条语句 end。
begin: count1s
reg[7:0] tempreg;
count=0;
tempreg = rega;
while(tempreg)
begin
if(tempreg[0]) count = count + 1;
tempreg = tempreg>>1;
end
end//用while循环语句对rega这个八位二进制数中值为1的位进行计数。
- for语句,格式:for(表达式1;表达式2;表达式3) 语句它的执行过程如下:
- 先求解表达式1;
- 求解表达式2,若其值为真(非0),则执行for语句中指定的内嵌语句,然后执行下面的
第3步。若为假(0),则结束循环,转到第5步。 - 若表达式为真,在执行指定的语句后,求解表达式3。
- 转回上面的第2步骤继续执行。
- 执行for语句下面的语句。
和C语言没多大区别。