### Verilog语言中的赋值与块语句特性详解 #### 一、Verilog语言简介 Verilog是一种硬件描述语言(HDL),广泛应用于数字电路的设计、验证以及仿真之中。通过使用Verilog,工程师能够以高层次的方式描述电路的行为,进而自动生成低层次的门级网表。本文将重点介绍Verilog中的两种基本赋值方式——非阻塞赋值和阻塞赋值,以及两种主要的块语句——顺序块和并行块。 #### 二、赋值方法 ##### 1. 非阻塞赋值 - **定义**:非阻塞赋值使用符号`<=`来进行赋值。 - **特点**:非阻塞赋值在块结束之后才完成赋值操作。这意味着被赋值的变量的值不是立即改变的,而是等到整个块执行完毕之后才更新。 - **应用场景**:这种赋值方式非常适用于模拟电路中同步信号的行为,比如寄存器的更新,因为在时钟边沿触发后,寄存器的状态变化需要在下一个时钟周期才生效。 - **示例代码**: ```verilog reg b; reg a; always @(posedge clk) begin b <= a; // 非阻塞赋值 end ``` ##### 2. 阻塞赋值 - **定义**:阻塞赋值使用符号`=`来进行赋值。 - **特点**:阻塞赋值在赋值语句执行完毕后块才结束。这意味着被赋值的变量的值会立即改变,这可能会导致代码中的其他依赖于该值的部分产生意想不到的结果。 - **应用场景**:在需要立即更新变量值的情况下使用阻塞赋值,例如在一些简单的逻辑计算或状态转移中。 - **示例代码**: ```verilog reg b; reg a; always @(posedge clk) begin b = a; // 阻塞赋值 end ``` #### 三、块语句 ##### 1. 顺序块 - **定义**:顺序块使用`begin`和`end`关键字来定义。在顺序块中,所有语句都是按照它们出现的顺序依次执行的。 - **特点**: - 块内的语句是按顺序执行的,上一条语句执行完才能执行下一条语句。 - 每条语句的延迟时间是相对于前一条语句的仿真时间而言的。 - 直到最后一条语句执行完,程序流程控制才跳出该语句块。 - **示例代码**: ```verilog always @(posedge clk) begin #10 a = 1; // 延迟10单位时间 #20 b = a; // 在前一条语句基础上再延迟20单位时间 end ``` ##### 2. 并行块 - **定义**:并行块使用`fork`和`join`关键字来定义。在并行块中,所有语句是同时执行的。 - **特点**: - 块内的语句是同时执行的,程序流程控制已进入到该并行块,块内语句则开始同时并行地执行。 - 块内每条语句的延迟时间相当于程序流程控制进入到块内的仿真时间。 - 当按时间时序排列在最后的语句执行完成后或一份`disable`语句执行时,流程控制跳出该程序块。 - **示例代码**: ```verilog always @(posedge clk) begin fork #10 a = 1; // 延迟10单位时间 #20 b = 1; // 同时延迟20单位时间 join end ``` #### 四、条件语句 ##### 1. if-else 语句 Verilog提供了三种形式的if语句: - `if (expression) statement` - `if (expression) statement1; else statement2;` - `if (expression1) statement1; elseif (expression2) statement2; ... elseif (expressionn) statementn; else statementn+1;` - **示例代码**: ```verilog if (a > b) out1 <= int1; else out2 <= int2; ``` ##### 2. case 语句 - **定义**:case语句用于基于某个控制表达式的值选择执行特定分支。 - **特点**: - 控制表达式通常表示为控制信号的某些位,分支表达式则用这些控制信号的具体状态值来表示。 - 当控制表达式的值与分支表达式的值相等时,就执行分支表达式后面的语句。 - `default`项可有可无,一个case语句里只准有一个`default`项。 - 每一个case分项的分支表达式的值必须互不相同,否则就会出现矛盾现象。 - case语句的所有表达式的值的位宽必须相等,以便控制表达式和分支表达式能够进行对应位的比较。 - **示例代码**: ```verilog case (a) 1'b0: out <= 1; 1'b1: out <= 2; default: out <= 3; endcase ``` 通过以上内容可以看出,Verilog语言中的赋值和块语句是实现复杂电路行为的关键部分。正确理解这些概念对于高效设计和验证数字电路至关重要。
赋值方法:
1)非阻塞赋值方法(如 b<=a)
块结束后才完成赋值操作、b的值并不是立刻改变、这是一种常用的赋值方法
2)阻塞赋值方法(如 b=a)
赋值语句执行完后块才结束、b的值在赋值语句执行后立刻改变、可能产生意想不到的结果
块语句-----通常用来将两条或多条语句组合在一起使其在格式上更像一条语句
一、顺序块
1)块内的语句是按顺序执行的,上一条语句执行完才能执行下一条语句
2)每条语句的延迟世家是相对于前一条语句的仿真时间而言的
3)直到最后一条语句执行完,程序流程控制才跳出该语句块
例:begin
语句 1;
语句 2;
…;
语句n;
end
或者
begin:块名
块内声明语句
语句1;
语句2;
…;
语句n;
end
二、并行块
1)块内语句是同时执行的,程序流程控制已进入到该并行块,块内语句则开始同时并行地执行
2)块内每条语句的延迟时间相当于程序流程控制进入到块内的仿真时间
- 粉丝: 0
- 资源: 5
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助