语句和结构说明语句"/>
Verilog语法之赋值语句和结构说明语句
赋值语句和块语句
赋值语句
verilog中,信号有两种赋值方式
1非阻塞赋值方式(b<=a;)
- 在语句块中,上面语句所赋值的变量值不能立即就为下面的语句所用
- 块结束后才能完成这次赋值操作,所赋的变量值是上一次赋值得到的
- 常用于编写可综合的时序逻辑模块
2阻塞赋值方式(b=a;)
- 赋值语句执行完后,块才结束
- b的值在赋值语句执行完后立刻就改变
- 在时序逻辑中使用时,产生意想不到的效果
e.g:用非阻塞赋值法确定reg型信号b,c
always @ (posedge clk)beginb<=a;c<=b;end
定义了2个reg型信号b,c。上升沿到来时,b等于a,c等于b,用到2个触发器
e.g:阻塞赋值法确定reg型信号b,c
always @ (posedge clk)beginb=a;c=b;end
只用到1个触发器寄存a的值,输出给b,c。
块语句
块语句将两条或多条语句组合在一起。块语句有2种
一种是begin_end,通常用来标识顺序执行的语句,该块称为顺序块
还有一种是fork_join,通常用来标识并行执行的语句,该块称为并行块。
1顺序块
(1)块内语句都是按顺序执行,执行完上一条语句才能执行下一条语句。
(2)每条语句的延迟时间是相对于前一条语句的仿真时间而言的。
(3)直到最后一条语句执行完,程序流程控制才跳出该语句块。
格式:
格式1begin语句1;语句2;语句n;
end格式2begin 块名块内声明语句语句1;语句2;语句n;
end
块名就是该块的名字,一个标识名,块内声明语句可以是参数声明语句,reg型,integer型,real型声明语句
e.g
beginareg=breg;creg=areg;//creg的值为breg的值
end
该语句中没有任何延迟,所以creg的值就是breg的值
e.g
parameter d=50;//声明d是一个参数为50
reg[7:0] r;//r是一个8位寄存器变量
begin//一系列延迟会产生波形#d r='h35;#d r='hE2;#d r='h00;#d r='hF7;#d -> end_ware;//->表示触发事件end_ware使其翻转
end
2并行块
(1)块内语句都是同时执行
(2)块内每条语句的延迟时间是相对于程序流程控制进入到块内的仿真时间的
(3)延迟时间用来给赋值语句提供执行时序
(4)按时间顺序排序在最后的语句执行完成后或一个disable语句执行时,程序流程控制跳出该程序块
e.g1
fork语句1;语句2;语句n;
join;
e.g2
fork:块名
块内声明语句语句1;语句2;语句n;
join
块名是标识该块的一个名字,相当于一个标识符
块内说明语句可以是参数说明语句,reg,integer,real,time型说明语句和event说明语句
e.g
fork#50 r='h35;#100 r='hE2;#150 r='h00;#200 r='hF7;#250 -> end_ware;//触发事件end_ware
join
3块名
verilog中可以给每个块取一个名字,只需在名字加在关键词begin或fork后面即可。
- 可在块内定义局部变量,只在块内使用的变量
- 可以允许被其他语句调用,如disable语句
- verilog中,所有变量都是静态的,所有变量都只有唯一的一个存储地址,进入或跳出块内并不影响存储在变量内的值
4起始时间和结束时间
顺序块中,起始时间是第一条语句被执行的时间,结束时间是最后一句语句执行完的时间
并行块中,起始时间是程序流程控制进入该块的时间,结束时间是按时间排序在在最后的语句执行结束的时间。
在并行块中,各条语句在前还是在后是无关紧要的。
e.g
fork#250 ->end_ware;#200 r='hF7;#150 r='h00;#100 r='hE2;#50 r='h35;
join
其生成的波形与上述例子一样。
更多推荐
Verilog语法之赋值语句和结构说明语句
发布评论