verilog学习|【笔记】第五章 条件语句、循环语句、块语句和生成语句


参考书:Verilog数字系统设计教程(第三版)夏宇闻等编著
本文学习Verilog语法中的条件语句、循环语句、块语句和生成语句的写法。



一、条件语句 ( if_else 语句)

1.三种格式

(1)  
if(表达式) 语句;
 
(2)
if (表达式)  语句1else         语句2(3)
if(表达式1)       语句1else if(表达式2)  语句2else if(表达式m)  语句m;
else              语句n;

2.注意

  • 条件语句必须在过程块语句中使用。
  • 即 由initial 和always语句引导的执行语句集合。
  • 且只能在 这两种块语句引导的begin_end块中编写。

3.说明

(1)表达式为逻辑表达式,0,x,z,按“假”处理;1按“真”处理。
(2)if 和 else 中,可以内嵌 begin_end 构成的复合块语句。
(3)允许简写方式。if (expression) 等同于 if (expression == 1)
(4)if语句嵌套格式如下:

if(表达式1)
	if(表达式2)  语句1else         语句2else
	if(表达式3)  语句3else                语句4

若if与else数目不一样,用begin_end 块语句确定匹配关系:

if (  )
	begin
	if (   )   语句1
	end
else
	语句2

二、case语句

1.格式:

(1) 
case (表达式)   
	<case分支项>  
endcase
(2)
 casez(表达式)   
 	<case分支项>  
endcase
(3) 
casex(表达式)   
	<case分支项>   
endcase

分支项格式如下

分支表达式:       语句;
默认项(default)  语句;

示例代码如下:

case (expression)
	alternative 1 :  statement 1;
	alternative 2 :  statement 2;
	    ┊
	alternative n :  statement n;
	default : default_statement
endcase

2.注意:

(1)表达式

  • case (表达式)中的表达式为控制表达式;分支项中的表达式为分支表达式。
  • 控制表达式 表示 控制信号的某些位;分支表达式 表示 具体状态值。

(2)所有分支表达式的值 都没有与 控制表达式的值 相匹配时,执行default语句。
(3)default可有可无,但一个case语句中只允许有一个。
(4)case语句 所有表达式位宽必须相等,要用<位宽><进制><数字>表示方式。
(5)case,casez,casex 真值表
在这里插入图片描述

  • casez语句 不考虑z的比较过程;
  • casex语句 不考虑x与z的比较过程;
  • 即不将该位的状态考虑在内。

(6)条件都不符合时,且没有默认项,会出现锁存器。

三、循环语句

 四种  {  forever 语句:连续的执行语句   repeat 语句:连续执行一条语句  n  次   while 语句:执行一条语句直到某个条件不满足   for 语句  \text { 四种 }\left\{\begin{array}{l} \text { forever 语句:连续的执行语句 } \\ \text { repeat 语句:连续执行一条语句 } \mathrm{n} \text { 次 } \\ \text { while 语句:执行一条语句直到某个条件不满足 } \\ \text { for 语句 } \end{array}\right. 四种  forever 语句:连续的执行语句  repeat 语句:连续执行一条语句 n   while 语句:执行一条语句直到某个条件不满足  for 语句 

1. forever语句

  • 格式:
forever  语句;

或:

forever
begin  
	多条语句;
end
  • 常用于 产生周期性的波形,必须写在initial块中

2. repeat语句

  • 格式:
repeat(表达式)  语句;

或:

repeat(表达式)
begin  
	多条语句;
end
  • 表达式为常量表达式

3. while语句

  • 格式:
while(表达式)  语句;

或:

while(表达式)
begin  
	多条语句;
end

4. for语句

  • 格式:
for (表达式1;表达式2;表达式3)  语句;

for (循环变量赋初值;循环结束条件;循环变量增值) 执行语句;

四、块语句特点

 三个特点  {  嵌套块   命名块   命名块的禁用  \text { 三个特点 }\left\{\begin{array}{c} \text { 嵌套块 } \\ \text { 命名块 } \\ \text { 命名块的禁用 } \end{array}\right. 三个特点  嵌套块  命名块  命名块的禁用 

1. 嵌套块

  • 顺序块与并行块 能够混合使用。

2. 命名块

  • 块可以具有自己的名字。
  • 命名块中可以声明局部变量。
  • 命名块是设计层次的一部分,声明的变量可以通过层次名引用进行访问。
  • 命名块可以被禁用,例如停止其执行。
//命名块
module top;
	initial
		begin : block1    //名字为block1 的顺序命名块
			integer  i;  //整型变量i是block1 的命名块的静态本地变量
			……        //可以用层次名 top.block1.i 被其他模块访问
		end
	initial
		fork : block2   //名字为block2 的并行命名块
			reg  i;    //寄存器变量i是block2 的命名块的静态本地变量 
			……       //可以用层次名 top.block2.i 被其他模块访问
		join
endmodule

2. 命名块的禁用

  • 通过 disable 中止命名块。

  • disable 可以用来 从循环中退出、处理错误条件、根据控制信号来控制代码执行。

  • 可以禁用设计中的任意一个命名块。

五、生成块

1. 嵌套块

  • 生成语句可以动态的生成verilog代码,当对矢量中的多个位进行重复操作时,或者当进行多个模块的实例引用的重复操作时,或者根据参数的定义来确定程序中是否应该包含某段Verilog代码的时候,使用生成语句能大大简化程序的编写过程。
  • 生成语句能够 控制变量的声明、任务、函数的调用、对实例引用进行全面的控制。
  • 关键字 generate_endgenerate 指定生成的实例范围。
  •  生成实例类型  {  模块   用户定义原语   门级原语   连续赋值语句   initial 和 always 块  \text { 生成实例类型 }\left\{\begin{array}{c} \text { 模块 } \\ \text { 用户定义原语 } \\ \text { 门级原语 } \\ \text { 连续赋值语句 } \\ \text { initial 和 always 块 } \end{array}\right. 生成实例类型  模块  用户定义原语  门级原语  连续赋值语句  initial  always  
  •  允许在生成范围内声明的数据类型  { net ⁡ ( 网线)、 reg(寄存器)   integer(整数型) 、 real(实型数) 、 time(时间型)、realtime(实数时间型)   event(事件)  \text { 允许在生成范围内声明的数据类型 }\left\{\begin{array}{c} \operatorname{net}(\text {网线)、 reg(寄存器) } \\ \text { integer(整数型) 、 real(实型数) 、 time(时间型)、realtime(实数时间型) } \\ \text { event(事件) } \end{array}\right. 允许在生成范围内声明的数据类型 net(网线) reg(寄存器 integer(整数型 real(实型数 time(时间型)realtime(实数时间型 event(事件
  • 生成的数据类型具有唯一标识名,可以被层次引用。
  •  不允许出现在生成范围之中的模块声明  {  参数、剭入、部参数   输出声明   指定块  \text { 不允许出现在生成范围之中的模块声明 }\left\{\begin{array}{c} \text { 参数、剭入、部参数 } \\ \text { 输出声明 } \\ \text { 指定块 } \end{array}\right. 不允许出现在生成范围之中的模块声明  参数、剭入、部参数  输出声明  指定块 
  •  三种创建生成语句的方法  {  循环生成 generate-for  条件生成 generate-if  case 生成 generate-case  \text { 三种创建生成语句的方法 }\left\{\begin{array}{l} \text { 循环生成 generate-for} \\ \text { 条件生成 generate-if} \\ \text { case 生成 generate-case } \end{array}\right. 三种创建生成语句的方法  循环生成 generate-for 条件生成 generate-if case 生成 generate-case 

generate-for语句:

(1) 必须有genvar关键字定义for语句的变量。

(2)for语句的内容必须加begin和end(即使就一句)。

(3)for语句必须有个名字。


思考题答案

以上就是第五章的知识点。
第五章思考题答案:《Verilog数字系统设计教程》夏宇闻 第三版思考题答案(第五章)


版权声明:本文为florence_jz原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。