参考书:Verilog数字系统设计教程(第三版)夏宇闻等编著
本文学习Verilog语法中的条件语句、循环语句、块语句和生成语句的写法。
文章目录
一、条件语句 ( if_else 语句)
1.三种格式
(1)
if(表达式) 语句;
(2)
if (表达式) 语句1;
else 语句2;
(3)
if(表达式1) 语句1;
else if(表达式2) 语句2;
else 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) 语句1;
else 语句2;
else
if(表达式3) 语句3;
else 语句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数字系统设计教程》夏宇闻 第三版思考题答案(第五章)