赋值语句和块语句
赋值方法:
1)非阻塞赋值方法(如 b<=a)
块结束后才完成赋值操作、b的值并不是立刻改变、这是一种常用的赋值方法
2)阻塞赋值方法(如 b=a)
赋值语句执行完后块才结束、b的值在赋值语句执行后立刻改变、可能产生意想不到的结果
块语句-----通常用来将两条或多条语句组合在一起使其在格式上更像一条语句
一、顺序块
1)块内的语句是按顺序执行的,上一条语句执行完才能执行下一条语句
2)每条语句的延迟世家是相对于前一条语句的仿真时间而言的
3)直到最后一条语句执行完,程序流程控制才跳出该语句块
例:begin
语句 1;
语句 2;
…;
语句n;
end
或者
begin:块名
块内声明语句
语句1;
语句2;
…;
语句n;
end
二、并行块
1)块内语句是同时执行的,程序流程控制已进入到该并行块,块内语句则开始同时并行地执行
2)块内每条语句的延迟时间相当于程序流程控制进入到块内的仿真时间
3)延迟时间是用来给赋值语句提供执行时序的
4)当按时间时序排列在最后的语句执行完成后或一份disable语句执行时,流程控制跳出该程序块
例:fork
语句 1;
语句 2;
…;
语句 n;
join
或者 fork
块名
块内声明语句
语句 1;
语句 2;
…;
语句 n;
join
三、块名
在verilog中可以给每个块一个块名,只需将名字加在关键字begin或fork后面即可
四、起始时间和结束时间
在并行块和顺序块中都有一个起始时间和结束时间的概念。对于顺序块,起始时间就是第一条语句开始被执行的时间,结束时间就是最后一条语句执行完的时间
对于并行块,起始时间对于块内所有的语句都是相同的,即程序流程控制进入该块的时间,其结束时间是按时间安排的在最后的语句执行完的时间
条件语句
一、if else语句 verilog语言提供了三种形式的if语句
(1) if(表达式)语句
if(a>b)
out 1<=int 1;
(2) if(表达式) 语句1;
else 语句2;
if(a>b) out1<=int1;
else out2<=int2;
(3)if(表达式1) 语句1;
else if(表达式2) 语句2;
else if(表达式3) 语句3;
…
else if(表达式m) 语句m;
else 语句n;
二、case语句
a)case括弧内的表达式称为控制表达式,case分支项中的表达式称为分支表达式。控制表 达式通常表示为控制信号的某些位,分支表达式则用这些控制信号的具体状态值来表示, 因此 分支表达式又可以称为常量表达式。
b)当控制表达式的值与分支表达式的值相等时,就执行分支表达式后面的语句。如果所有 的分支表达式的值都没有与控制表达式的值相匹配的,就执行default后面的语句。
c)default项可有可无,一个case语句里只准有一个default项。
d) 每一个case分项的分支表达式的值必须互不相同,否则就会出现矛盾现象(对表达式的同 一个值,有多种执行方案)。
e) 执行完case分项后的语句,则跳出该case语句结构,终止case语句的执行。
f) 在用case语句表达式进行比较的过程中,只有当信号的对应位的值能明确进行比较时, 比较才能成功。因此要注意详细说明case分项的分支表达式的值。
g) case语句的所有表达式的值的位宽必须相等,只有这样控制表达式和分支表达式才能进 行对应位的比较。一个经常犯的错误是用’bx, 'bz 来替代 n’bx, n’bz,这样写是不对 的,因为信号x, z的缺省宽度是机器的字节宽度,通常是32位(此处 n 是case控制表达 式的位宽)。