第-五讲--行为建模PPT课件.ppt_第1页
第-五讲--行为建模PPT课件.ppt_第2页
第-五讲--行为建模PPT课件.ppt_第3页
第-五讲--行为建模PPT课件.ppt_第4页
第-五讲--行为建模PPT课件.ppt_第5页
已阅读5页,还剩54页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第五讲行为建模 内容 行为建模过程块语句过程赋值过程中的块语句过程的时序控制阻塞与非阻塞过程赋值条件语句 行为建模 描述 行为建模 描述 行为级描述是对系统的高抽象级描述 在这个抽象级 注重的是整个系统的功能而不是实现 Verilog有高级编程语言结构用于行为描述 包括 initial always wait for while ifelse case和forever等 Verilog的行为建模是用一系列以高级编程语言编写的并行的 动态的过程块来描述系统的工作 在每一个时钟上升沿 若Clr不是低电平 置Q为D值 置Qb为D值的反 D触发器行为 无论何时Clr变低置Q为0 置Qb为1 过程块 procedural 过程块是行为模型的基础 一个模块中可以有多个过程块 过程块有两种 initial块 只能执行一次always块 循环执行过程块中有下列部件过程赋值语句 描述过程块中的数据流时序控制 控制块的执行及块中的语句时序高级结构 循环 条件语句等 描述块的功能 过程块initial和always 都从0时刻开始执行 initial无触发条件 只执行一次 always按触发条件执行 或无触发条件时一直执行 一个module的行为描述中可以有多个initial和always语句 即有多个过程块存在 且相互独立 并行运行 modulename input 端口说明output reg 信号说明wire 功能描述assign 并行赋值语句initial 过程块语句always 过程块语句initial assign always endmodule 过程赋值 proceduralassignment 在过程块中的赋值称为过程赋值 在过程赋值语句中表达式左边的信号必须是寄存器类型 如reg类型 在过程赋值语句等式右边可以是任何有效的表达式 数据类型也没有限制 如果一个信号没有声明则缺省为wire类型 使用过程赋值语句给wire赋值会产生错误 moduleadder out a b cin inputa b cin output 1 0 out wirea b cin reghalf sum reg 1 0 out always aorborcin beginhalf sum a b cin OKhalf carry aendendmodule half carry没有说明 时序控制 顺序块语句 过程中的块语句 块语句用来将多个语句组织在一起 使得他们在语法上如同一个语句 块语句分为两类 顺序块 语句置于关键字begin和end之间 块中的语句以顺序方式执行 并行块 关键字fork和join之间的是并行块语句 块中的语句并行执行 Fork和join语句常用于testbench描述 这是因为可以一起给出矢量及其绝对时间 而不必描述所有先前事件的时间 顺序块顺序块有以下特点 1 块内的语句是按顺序执行的 即只有上面一条语句执行完后下面的语句才能执行 2 每条语句的延迟时间是相对于前一条语句的仿真时间而言的 3 直到最后一条语句执行完 程序流程控制才跳出该语句块 顺序块的格式如下 begin语句1 语句2 语句n end 或begin 块名块内声明语句语句1 语句2 语句n end其中 块名即该块的名字 一个标识名 其作用后面再详细介绍 块内声明语句可以是参数声明语句 reg型变量声明语句 integer型变量声明语句 real型变量声明语句 下面举例说明 例1 beginareg breg creg areg creg的值为breg的值 end从该例可以看出 第一条赋值语句先执行 areg的值更新为breg的值 然后程序流程控制转到第二条赋值语句 creg的值更新为areg的值 因为这两条赋值语句之间没有任何延迟时间 creg的值实为breg的值 当然可以在顺序块里延迟控制时间来分开两个赋值语句的执行时间 见 例2 例2 beginareg breg 10creg areg 在两条赋值语句间延迟10个时间单位 end 例3 parameterd 50 声明d是一个参数reg 7 0 r 声明r是一个8位的寄存器变量begin 由一系列延迟产生的波形 dr h35 dr hE2 dr h00 dr hF7 d end wave 触发事件end waveend 并行块并行块有以下四个特点 1 块内语句是同时执行的 即程序流程控制一进入到该并行块 块内语句则开始同时并行地执行 2 块内每条语句的延迟时间是相对于程序流程控制进入到块内时的仿真时间的 3 延迟时间是用来给赋值语句提供执行时序的 4 当按时间时序排序在最后的语句执行完后或一个disable语句执行时 程序流程控制跳出该程序块 并行块的格式如下 fork语句1 语句2 语句n join fork 块名块内声明语句语句1 语句2 语句n join其中 块名即标识该块的一个名字 相当于一个标识符 块内说明语句可以是参数说明语句 reg型变量声明语句 integer型变量声明语句 real型变量声明语句 time型变量声明语句 事件 event 说明语句 下面举例说明 例4 fork 50r h35 100r hE2 150r h00 200r hF7 250 end wave 触发事件end wave join在这个例子中用并行块来替代了前面例子中的顺序块来产生波形 用这两种方法生成的波形是一样的 有名块 格式 begin 块名 end或fork 块名 join 有名块的块名作用 便于实现对块语句的有效控制用disable语句终止或提前结束有名块的执行过程允许在块内引入局部变量只在块内起作用的变量变量名可以和块外的其他变量名相同一定是寄存器类例 begin SEQ BLKreg 3 0 satsat maskend 过程的时序控制 在过程块中可以说明过程时序 过程时序控制有三类 延时执行 delay 延迟指定时间步后执行语句边沿敏感事件的时序控制 在信号发生翻转后执行语句 可以说明信号有效沿是上升沿 posedge 还是下降沿 negedge 可以用关键字or指定多个参数 电平敏感事件的时序控制 wait 直至expr值为真时 非零 才执行语句 若expr已经为真则立即执行语句 延时执行 语法 执行过程 定时控制 求表达式 赋值举例 10reg a reg b 延时10个单位后 执行赋值 2q a 延时2个单位后 求表达式 赋 值 与assign语句延时相似 为惯性延时 延时执行 在testbench中使用延时执行 延时 施加激励 或在行为模型中模拟实际延时 modulemuxtwo out a b sl inputa b sl outputout regout always sloraorb if sl 10out a 从a到out延时10个时间单位else 12out b 从b到out延时12个时间单位endmodule 在延时执行中可以使用模块参数parameter moduleclock gen clk outputclk regclk parametercycle 20 initialclk 0 always cycle 2 clk clk endmodule 延时执行例 moduleclk gen demo clock1 clock2 outputclock1 clock2 regclock1 clock2 initialbeginclock1 0 clock2 1 endalwaysbegin 50clock1 clock1 endalwaysbegin 100clock2 clock2 endendmodule 若赋值延时为0 结果将如何 alwaysbegin 0clock1 clock1 end 块语句中的延时执行 在顺序块中 语句一条接一条地计算执行 在并行块中 所有语句在各自的延迟之后立即计算执行 begin 5a 3 5a 5 5a 4 end fork 5a 3 15a 4 10a 5 join 上面的两个例子在功能上是等价的 Fork join例子里的赋值故意打乱顺序是为了强调顺序是没有关系的 注意fork join块是典型的不可综合语句 并且在一些仿真器中效率较差 边沿敏感事件的时序控制 事件控制 事件控制敏感表 等待直到事件发生后执行 信号名 信号名有变化就触发事件 例 clock a b posedge信号名 信号名有上升沿就触发事件 例 posedgeclock a b negedge信号名 信号名有下降沿就触发事件例 negedgeclock a b 敏感事件1or敏感事件2or 敏感事件之一触发事件例 posedgeresetorposedgeclear reg out 0 aorb c a 边沿敏感事件的时序控制例 modulereg adder out a b clk inputclk input 2 0 a b output 3 0 out reg 3 0 out reg 3 0 sum always aorb 若a或b发生任何变化 执行 5sum a b always negedgeclk 在clk下降沿执行out sum endmodule 模块reg adder描述了什么电路 电平敏感事件的时序控制 事件控制 wait 变量或表达式事件 等待直到事件为真 1 执行后续语句 例 modulelatch adder out a b enable inputenable input 2 0 a b output 3 0 out reg 3 0 out always aorb beginwait enable 当enable为低电平时执行加法out a b endendmodule 综合工具还不支持wait语句 过程的时序控制例 modulewait test regclk waito edgeo initialbeginclk 0 edgeo 0 waito 0 end 信号赋初值0always 50clk clk 描述clkalways clk 10edgeo clk 描述edgeoalwayswait clk 10waito waito 描述waitoendmodule 仿真中行为描述例 在本例中发生下面顺序的事件 等待set 1 忽略时刻10的clk的posedge 等待下一个clk的posedge 它将在时刻30发生 等待3个时间单位 在时刻33 30 3 置q 1 等待10个时间单位 在时刻43 33 10 置q 0 等待在时刻48发生的set 0 等待在时刻70发生且与clk的上升沿同时发生的set 1 等待下一个上升沿 时刻70的边沿被忽略 因为到达该语句时时间已经过去了 如例子所示 clk 1 注 在实际硬件设计中 事件6应该被视为一个竞争 racecondition 在仿真过程中 值的确定倚赖于clk set产生顺序 所以是不可预测的 这是不推荐的建模类型 alwayswait set begin posedgeclk 3q 1 10q 0 wait set end 竞争 设计中行为描述例 RTL级设计中只使用边沿敏感事件的时序控制 moduledff q qb d clk outputq qb inputd clk regq qb always posedgeclk beginq d qb d endendmodule 简单D触发器 延迟赋值语句 语法 执行过程 求表达式 定时控制 赋值举例 reg a 10reg b 延时10个单位后 执行赋值 q 2 a 求表达式子 延时2个单位后赋值 与assign语句延时不同 为传输延时 在延迟赋值语句中表达式的值都有一个隐含的临时存储 可以用来简单精确地模拟寄存器交换和移位 延迟赋值语句 在下面的每个例子中 a和b的值什么时候被采样 什么时候给a和b赋值 在左边的例子中 b的值被立即采样 时刻0 这个值在时刻5赋给a a的值在时刻5被采样 这个值在时刻10赋给b 注意 另一个过程块可能在时刻0到时刻5之间影响b的值 或在时刻5到时刻10之间影响a的值 在右边的例子中 b和a的值被立即采样 时刻0 保存的值在时刻5被赋值给他们各自的目标 这是一个安全传输 注意 另一个过程块可以在时刻0到时刻5之间影响a和b的值 零延迟控制 在同一仿真时刻 位于不同always和initial块中的过程语句有可能被同时计算 但是执行 赋值 顺序是不确定的 与使用的仿真器类型有关 在这种情况下 零延迟控制可以保证带零延迟控制的语句将在执行时刻相同的多条语句中最后执行 从而避免发生竞争 需要注意 若存在多条零延迟控制的语句 那么他们之间的执行顺序也是不确定的 initialbeginx 0 y 0 endinitialbegin 0 x 1 0y 1 end 例 d的最终值是什么 initialbeginb 1 b1 c 1 b0 10b 1 b0 endinitialbegind 25 b c end 例 该块的执行结束时间是多少 事件的执行顺序是怎样的 每条语句的仿真结束时间是多少 initialbeginx 1 b0 5y 1 b1 fork 20a x 15b y join 40 x 1 b1 fork 10p x begin 10a y 30b x end 5m y joinend 0 x 0y 1b 1a 0 x 1m 1a 1 p 1105b 1 0b 1 c 0b 025d 1 命名事件 namedevent 在仿真行为代码中定义一个命名事件可以触发一个活动 命名事件不可综合 moduleadd mult out a b input 2 0 a b output 3 0 out reg 3 0 out defineevents eventadd mult always aorb if a b add triggerevent else mult triggerevent respondtoaneventtrigger always add out a b respondtoaneventtrigger always mult out a b endmodule 在例子中 事件add和mult不是端口 但定义为事件 它们没有对应的硬件实现 由关键字event生明 能在过程块中触发一个使能 不保存任何值 只能在过程块中触发事件 操作符用来触发命名事件 a大于b 事件add被触发 控制传递到等待add的always块 如果a小于或等于b 事件mult被触发 控制被传送到等待mult的always块 在VerilogHDL语言中 信号有两种赋值方式 1 非阻塞 Non Blocking 赋值方式 如b a 块结束后才完成赋值操作 b的值并不是立刻就改变的 这是一种比较常用的赋值方法 特别在编写可综合模块时 2 阻塞 Blocking 赋值方式 如b a 赋值语句执行完后 块才结束 b的值在赋值语句执行完后立刻就改变的 可能会产生意想不到的结果 赋值语句 非阻塞赋值方式和阻塞赋值方式的区别常给设计人员带来问题 问题主要是给 always 块内的reg型信号的赋值方式不易把握 always 模块内的reg型信号都是采用非阻塞赋值方式 b a 这种方式的赋值并不是马上执行的 也就是说 always 块内的下一条语句执行后 b并不等于a 而是保持原来的值 always 块结束后 才进行赋值 而另一种赋值方式阻塞赋值方式 如下所示 b a 这种赋值方式是马上执行的 也就是说执行下一条语句时 b已等于a 尽管这种方式看起来很直观 但是可能引起麻烦 例1 always posedgeclk beginb a c b end 例1 中的 always 块中用了非阻塞赋值方式 定义了两个reg型信号b和c clk信号的上升沿到来时 b就等于a c就等于b 这里应该用到了两个触发器 请注意 赋值是在 always 块结束后执行的 c应为原来b的值 这个 always 块实际描述的电路功能如下图所示 例2 always posedgeclk beginb a c b End 例2 中的 always 块用了阻塞赋值方式 clk信号的上升沿到来时 将发生如下的变化 b马上取a的值 c马上取b的值 即等于a 生成的电路图如下所示只用了一个触发器来寄存器a的值 又输出给b和c 这大概不是设计者的初衷 如果采用 例1 所示的非阻塞赋值方式就可以避免这种错误 顺序块中的非阻塞过程赋值 阻塞过程赋值执行完成后再执行在顺序块内下一条语句 非阻塞赋值不阻塞过程流 不受前面语句执行的影响 直接由块起始时刻开始执行 同一块中不能混用 和 若过程块中的所有赋值都是非阻塞的 赋值按两步进行 仿真器计算所有右端表达式的值 保存结果 在经过时序控制延迟后 仿真器将保存的值赋给左端变量 阻塞过程赋值 顺序块中的阻塞赋值语句按顺序执行 例regx y z reg 15 0 reg a reg b integercount initialbeginx 0 y 1 z 1 count 0 reg a 16 b0 reg b reg a 15reg a 2 1 b1 10reg b 15 13 x y z count count 1 end 多个非阻塞赋值语句并发执行 例regx y z reg 15 0 reg a reg b integercount initialbeginx 0 y 1 z 1 count 0 reg a 16 b0 reg b reg a reg a 2 151 b1 reg b 15 13 10 x y z count count 1 end 非阻塞过程赋值 modulenon block1 rega b c d e f initialbegin blockingassignmentsa 101 time10b 20 time12c 41 time16endinitialbegin non blockingassignmentsd 101 time10e 20 time2f 41 time4endinitialbegin monitor time a bb bc bd be bf b a b c d e f 100 finish endendmodule 输出结果 0a xb xc xd xe xf x2a xb xc xd xe 0f x4a xb xc xd xe 0f 110a 1b xc xd 1e 0f 112a 1b 0c xd 1e 0f 116a 1b 0c 1d 1e 0f 1 例1 阻塞与非阻塞赋值语句行为差别 非阻塞过程赋值 例3 阻塞与非阻塞赋值语句行为差别 非阻塞过程赋值 例5 在时序逻辑设计中主要采用非阻塞赋值语句 moduleshift q0 q1 q2 d clk outputq0 q1 q2 inputd clk regq0 q1 q2 always posedgeclk beginq0 d q1 q0 q2 q1 endendmodule 模块shift描述的电路 条件语句 if else 语法1 if 条件表达式 块语句条件表达式为逻辑真和逻辑1时执行块语句 其它如0 x z均为条件不成立 一条没有else语句的if语句映射到硬件上 形成的是一个锁存器 如 always enableordada if enbale out data 条件语句 if else 语法2 if 条件表达式1 块语句1elseif 条件表达式2 块语句2 elseif 条件表达式n 块语句nelse块语句n 1常用于多路选择控制 条件判断的先后顺序隐含条件的优先级关系 注意有时电路设计不需要优先级 使用case语句描述可得到并行条件 可以嵌套使用 如无块标识符 else语句与最近的if配对 条件语句 if else 例 Always enableordada aordata b 信号有变化执行if语句if enable out data a enable 1 执行elseout data b enable 0 执行 综合结果将产生一个二选一的多路选择器 MUX 等效于语句 assignout enable data a data b 条件要完备 否则产生锁存器 条件语句 if else 例 同步清零D触发器描述moduledff sync q d clear clk outputq inputd clear clk regq always posedgeclk 时钟clk上升沿执行操作if clear 时钟clk上升沿时刻 clear为0 q 0 则输出q为0 elseq d 时钟clk上升沿时刻 clear为1 d赋给q endmodule 条件语句 if else 举例 异步清零D触发器moduledff sync q d clear clk outputq inputd clear clk regq always negedgeclearorposedgeclk if clear clear下升沿时刻 clear为0 q 0 则输出q为0 与clk无关 elseq d 时钟clk上升沿时刻 clear为1 d赋给q endmodule 条件语句 if else 在if和else后面可以包含一个内嵌的操作语句 也可以有多个操作语句 此时用begin和end这两个关键词将几个语句包含起来成为一个复合块语句 if a b beginout1 int1 out2 int2 endelsebeginout1 int2 out2 int1 end 条件语句 case 常用于译码和有限状态机的描述 分类 case casez casex 语法 case 敏感表达式 值1 块语句1值2 块语句2 值n 块语句ndefault 块语句n 1endcase敏感表达式与各项值的比较是按位作全等比较 条件语句 case 例 moduledemo case sig inputsig always sig case sig 1 b1 display signalvalueis1 1 b0 display signalvalueis0 1 bx display signalisunknown 1 bz display signalishighimpedence endcaseendmodule 条件语句 case 每一个case分项的分支表达式的值必须互不相同 否则就会出现矛盾现象 对表达式的同一个值 有多种执行方案 执行完case分项后的语句 则跳出该case语句结构 终止case语句的执行 在用case语句表达式进行比较的过程中 只有当信号的对应位的值能明确进行比较时 比较才能成功 因此要注意详细说明case分项的分支表达式的值 case语句的所有表达式的值的位宽必须相等 只有这样控制表达式和分支表达式才能进行对应位的比较 一个经常犯的错误是用 bx bz来替代n bx n bz 这样写是不对的 因为信号x z的缺省宽度是机器的字节宽度 通常是32位 此处n是case控制表达式的位宽

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论