Verilog行为建模

RTL级:寄存器传输级(Register Transfer Level),用于设计的可综合的一种抽象级;RTL描述方式是行为描述方式的子集;
行为级描述
是对系统的高抽象级描述。在这个抽象级,注重的是整个系统的功能而不是实现。
Verilog有高级编程语言结构用于行为描述,包括:
wait, while, if then, case和forever
过程(procedural)块
过程块是行为描述的基础,有两种:initial块,只能执行一次;always块,循环执行。
过程块中有下列部件:
– 过程赋值语句:在描述过程块中的数据流
– 高级结构(循环,条件语句):描述块的功能
– 时序控制:控制块的执行及块中的语句。
过程赋值(在过程块中赋值)
• 在过程赋值语句中表达式左边的信号必须是寄存器类型(如reg类型)
• 在过程赋值语句等式右边可以是任何有效的表达式,数据类型也没有限制。
• 如果一个信号没有声明则缺省为wire类型。使用过程赋值语句给wire赋值会产生错误。
过程赋值语句有两类:阻塞过程赋值(a=b)和非阻塞过程赋值(a<=b)
阻塞过程赋值执行完成后再执行在顺序块内下一条语句。
非阻塞赋值不阻塞过程流,仿真器读入一条赋值语句并对它进行调度之后,
就可以处理下一条赋值语句。
若过程块中的所有赋值都是非阻塞的,赋值按两步进行:

  1. 仿真器计算所有RHS表达式的值,保存结果,并进行调度在时序控制指
    定时间的赋值。
  2. 在经过相应的延迟后,仿真器通过将保存的值赋给LHS表达式完成赋值。

过程时序控制
在过程块中可以说明过程时序。过程时序控制有三类:
① 简单延时(#delay):延迟指定时间步后执行
在test bench中使用简单延时(#延时)施加激励,或在行为模型中模拟实际延时,在简单延时中可以使用模块参数parameter:
② 边沿敏感的时序控制:@()
时序控制@可以用在RTL级或行为级组合逻辑或时序逻辑描述中。可以用关键字posedge和negedge限定信号敏感边沿。敏感表中可以有多个信号,用关键字or连接。
always @( a or b) // 若a或b发生任何变化,执行
always @( negedge clk) // 在clk下降沿执行
注:事件控制符or和位或操作符|及逻辑或操作符||没有任何关系。
③ 电平敏感的时序控制:wait(
用于行为级代码中电平敏感的时序控制,用于行为级代码中电平敏感的时序控制。
– 直至expr值为真时(非零)才执行。
– 若expr已经为真则立即执行。
命名事件(named event)
在行为代码中定义一个命名事件可以触发一个活动。命名事件不可综合。
块语句
块语句用来将多个语句组织在一起,使得他们在语法上如同一个语句。
块语句分为两类:
• 顺序块:语句置于关键字begin和end之间,块中的语句以顺序方式执行(语句一条接一条地计算执行)
• 并行块:关键字fork和join之间的是并行块语句,块中的语句并行执行(所有语句在各自的延迟之后立即计算执行。)
• Fork和join语句常用于test bench描述。这是因为可以一起给出矢量及其绝对时间,而不必描述所有先前事件的时间。
注意fork-join块是典型的不可综合语句
延迟赋值语句
语法: LHS = RHS;
时序控制延迟的是赋值而不是右边表达式的计算。
在延迟赋值语句中RHS表达式的值都有一个隐含的临时存储。
可以用来简单精确地模拟寄存器交换和移位。
条件语句(if分支语句)
if 和if-else 语句:
可以多层嵌套。在嵌套if序列中,else和前面最近的if相关;
为提高可读性及确保正确关联,使用begin…end块语句指定其作用域;
描述方式:
if (表达式)
begin
……
end
else
begin
……
end
条件语句(case分支语句)
case语句是测试表达式与另外一系列表达式分支是否匹配的一个多路条件句。
• Case语句进行逐位比较以求完全匹配(包括x和z)。
• Default语句可选,在没有任何条件成立时执行。此时如果未说明default,Verilog不执行任何动作。
• 多个default语句是非法的。
重要内容:
使用default语句是一个很好的编程习惯,特别是用于检测x和z。
Casez和casex为case语句的变体,允许比较无关(don‘t-care)值。
• case表达式或case项中的任何位为无关值时,在比较过程中该位不予考虑。
• 在casez语句中,? 和z 被当作无关值。
• 在casex语句中,?,z 和x 被当作无关值
case语法:
case <表达式>
<表达式>, <表达式>:赋值语句或空语句;
<表达式>, <表达式>:赋值语句或空语句;
default:赋值语句或空语句;
循环(looping)语句
有四种循环语句:
1、repeat:将一块语句循环执行确定次数。
repeat (次数表达式) <语句>2、while:在条件表达式为真时一直循环执行
while (条件表达式) <语句> //只要表达式为真(不为0),则重复执行一条语句(或语句块)
3、forever:重复执行直到仿真结束,是过程块中最后一条语句。其后的语句将永远不会执行,通常用于test bench描述。这种行为描述方式可以非常灵活的
描述时钟,可以控制时钟的开始时间及周期占空比。仿真效率也高。
forever <语句>
4、for:在执行过程中对变量进行计算和判断,在条件满足时执行。只要条件为真就一直执行,条件表达式若是简单的与0比较通常处理得更快一些。但综合工具可能不支持与0的比较
for(赋初值;条件表达式;计算) <语句>
注:前三项综合工具还不支持
持续赋值
可以用持续赋值语句描述组合逻辑,代替用门及其连接描述方式。
• 持续赋值在过程块外部使用
• 持续赋值用于net驱动
• 持续赋值只能在等式左边有一个简单延时说明
– 只限于在表达式左边用#delay形式
• 持续赋值可以是显式或隐含的。
语法:
[#delay] [strength] = ;
持续赋值只能给组合逻辑建模,因为他们只包含简单延迟。过程块可以包
含@和wait时序控制。

你可能感兴趣的:(Verilog)