类别 | 语句 | 可综合性 |
过程语句 | initial | X |
always | √ | |
语句块 | 串行语句块begin-end | X |
并行语句块fork-join | X | |
赋值语句 | 连续赋值assign | √ |
过程赋值=、<= | √ | |
条件语句 | if-else | √ |
case,casez,casex | √ | |
循环语句 | forever | X |
repeat | X | |
while | X | |
for | √ |
2.2.1 过程语句
1.initial语句
语法格式:
initial begin 语句1; 语句2; ... 语句n; end
initial为断电触发模式,对应reset复位触发模式,可能造成不良后果,不常用。
作用为:
-
仿真测试
-
初始化
2. always语句块
always语句块的触发状态是一直存在的,只要满足always后面的敏感事件列表,就执行语句块
语法格式:
always@(<敏感事件列表>) 语句块; //例 @(a)//当信号a的值发生改变 @(a or b) = @(a,b)//当信号a或b的值发生改变 @(posedge clock)//当clock上升沿到来时 @(negedge clock)//当clock下降沿到来时 @(posedge clock or negedge reset)//当clock上升沿到来或reset下降沿到来时
3.过程语句使用中需要注意的问题
-
信号定义形式,无论是时序逻辑电路还是组合逻辑电路,Verilog要求在过程语句(initial和always)中,被赋值信号定义为reg类型
-
敏感事件列表方面。(1)对组合电路进行描述时,全部的输入信号需要列入敏感信号列表。(2)对时序电路进行描述时,把时间信号和部分输入信号列入敏感信号列表。不同的敏感事件列表会产生不同的电路形式。
2.2.2 语句块
1.串行语句块
语句按照串行方式顺序执行,可以用于可综合电路程序和仿真测试程序。
begin:块名 块内声明语句; 语句1; 语句2; ... 语句n; end
-
串行语句块中每条语句依据块中排列次序,先后逐条顺序执行。块中每条语句给出的延时都是相对于前一条语句执行结束的相对时间。
-
串行语句块的起始执行时间就是串行语句块中第一条语句开始执行的时间。结束时间是块中最后一条语句执行结束的时间。
2.并行语句块
只能用于仿真测试程序,不能用于可综合电路程序。
fork:块名 块内声明语句; 语句1; 语句2; ... 语句n; join
-
块内语句是同时执行的。
-
块内每条语句的延迟时间是相对于程序流程控制进入到块内的仿真时间。
语句块 | 串行语句块(begin-end) | 并行语句块(fork-join) |
---|---|---|
执行顺序 | 按照语句顺序执行 | 同一时刻执行 |
语句前面延时的意义 | 相对于前一条语句执行结束的相对时间 | 相对于并行语句块启动时的时间 |
起始时间 | 首句开始执行的时间 | 转入并行语句块的时间 |
结束时间 | 最后一条语句执行结束时的时间 | 执行时间最长的那条语句执行结束时的时间 |
行为描述的意义 | 电路中数据在时钟及控制信号作用下,沿数据通道的各级寄存器之间的传送过程 | 电路上电后,各电路模块同时开始工作的过程 |
2.2.3过程赋值语句
1.阻塞性过程赋值语句
变量 = 表达式;
例:a = b;
-
在串行语句块中,阻塞赋值语句按照先后排列顺序依次执行;并行语句块中,阻塞赋值语句同时执行,没有先后顺序之分。
-
阻塞赋值语句的顺序,先计算等号右端表达式的值,然后立刻将计算的值赋给左边的变量,与仿真时间无关。
2.非阻塞性过程赋值语句
变量 <= 表达式;
b <= a;
-
在串行语句块中,各条非阻塞赋值语句执行过程没有先后顺序之分,各条语句并行执行。
-
执行非阻塞赋值语句的顺序是,先计算右端表达式的值,然后等到延时时间结束时,将计算的值赋给左边的变量。
2.2.4过程连续赋值语句(不可综合语言)
1.赋值、重新赋值语句(assign,deassign)
assign<寄存器型变量>=<赋值表达式>; deassign<寄存器型变量>;
作用:临时获得一个具有优先级的数据
2.强制、释放语句(force,release)
force<寄存器型变量>=<赋值表达式>; release<寄存器型变量>;
优先级高于assign-deassign
在大量代码测试时,需要临时改变信号量时使用
2.2.5 条件分支语句
1. if 条件语句
形式1:if(条件表达式)语句块; 形式2:if(条件表达式) 语句块1; else 语句块2; 形式3:if(条件表达式1) 语句块1; else if(条件表达式2) 语句块2; ... else if(条件表达式i) 语句块i; else 语句块n; 形式4:if(条件表达式1) if(条件表达式2)//内嵌if语句 语句块1; else 语句块2; else
物理意义:生成2选1数据选择器
2.case条件分支语句
case语句是一种可实现多路分支选择控制的语句,多用于多条件译码电路设计
case(控制表达式) 值1:语句块1 值2:语句块2 ... 值n:语句块n defalt:语句块n+1 endcase
case | 0 | 1 | x | z |
---|---|---|---|---|
0 | 1 | 0 | 0 | 0 |
1 | 0 | 1 | 0 | 0 |
x | 0 | 0 | 1 | 0 |
z | 0 | 0 | 0 | 1 |
casez | 0 | 1 | x | z |
---|---|---|---|---|
0 | 1 | 0 | 0 | 1 |
1 | 0 | 1 | 0 | 1 |
x | 0 | 0 | 1 | 1 |
z | 1 | 1 | 1 | 1 |
casex | 0 | 1 | x | z |
---|---|---|---|---|
0 | 1 | 0 | 1 | 1 |
1 | 0 | 1 | 1 | 1 |
x | 1 | 1 | 1 | 1 |
z | 1 | 1 | 1 | 1 |
-
值1到值n之间必须各不相同,一旦判断到与某值相同并执行语句块后,case语句的执行便结束。
-
如果某几个连续排列的值执行的是同一条语句,这几个值之间用逗号隔开,将语句放在这几个值最后一个中。
-
若已经列出敏感表达式所有可能值,default可以省略
-
case语句所有表达式的值位宽必须相等,这样控制表达式和分支表达式才可能进行对应位的比较
-
使用case语句时,应包含所有状态,如果没有包含完整,必须写缺省项,否则将会产生锁存器(latch),在同步时序电路中不允许存在。
2.2.6循环语句
1. forever循环语句
永久循环,遇到系统任务$finish为止,或者使用disable语句
forever 语句或语句块;
2. repeat循环语句
执行固定次数的循环
repeat(循环次数表达式) 语句或语句块(循环体);
3.while循环语句
条件循环
while(条件表达式) 语句或语句块;
4. for循环语句
条件循环
for(循环变量赋初值;循环结束条件;循环变量增值)语句块;
循环语句暂时不要再可综合语句中使用
2.2.7综合的概念
表述:用行为和功能层次表达的电子系统转换为低层次的、便于具体实现的模块组合装配的过程。
-
自然语言转换到verilog语言算法表述,即自然语言综合。
-
算法表述转换到寄存器传输级(Register Transport Level,RTL)表述,即从行为域到结构域的综合,也称行为综合
-
从RTL级表述综合转换到逻辑门表述,即逻辑综合。
-
从逻辑门表述转换到版图级表述,或转换到FPGA的配置网表文件,称为版图综合或者结构综合。