第三章EDA_行为级建模
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
在实际设计中,尽量 不要使用零延迟控制
行为级建模
⑵ 基于事件的时序控制
事件:指某个寄存器或线网变量的值发生了变化。 事件可以用来触发声明语句或块语句的执行。 4种类型的事件控制:常规事件控制、命名事件控制、OR(或)事件控 制和电平敏感时序控制 ① 常规事件控制 使用符号@来标明,语句继续执行的条件是信号发生变化、正跳 变或负跳变 posedge用于指明正向跳变,negedge用于指明负向跳变
行为级建模
行为级建模
⑷ forever 循环
永久循环,执行无限的循环直到遇到系统任务 $finish
如果需要从 forever 循环中退出,可以使用 disable 语句 通常forever循环和时序控制结构结合使用
行为级建模
顺序块和并行块
块语句的作用? 行为级块语句的两种类型:顺序块和并行块
行为级建模
条件语句
如果 true_statement 和 false_statement 是一组语句,通常用begin 和 end关键字将它们组成一个块语句
行为级建模
行为级建模
多路分支语句
用关键字case、endcase和default来表示
可选,在一条case语 句中不允许有多条
Case语句的行为类似于多路选择器
行为级建模
行为级建模
选择信号中有不确定值x,则输出为x 选择信号中有高阻值z,则输出为z 选择信号中一位为x,另外一位为z,则x的优先级高
行为级建模
casex 和 casez 关键字
casez语句将条件表达式或候选项表达式中的z作为无关值,所有值为 z的位也可以用“?”表示 casex语句将条件表达式或候选项表达式中的x作为无关值
怎样修改?
行为级建模
使用阻塞赋值来达到非阻塞赋值的目的(修改前页)
(阻塞、非阻塞对比)
阻塞与非阻塞赋值语句行为差别举例1
module non_block1; 输出结果: reg a, b, c, d, e, f; 0 a= x b= x c= x d= x e= x f = x initial begin // blocking assignments a = #10 1; // 2 a= x b= x c= x d= x e= 0 f = x b = #2 0; // 4 a= x b= x c= x d= x e= 0 f = 1 c = #4 1; // end 10 a= 1 b= x c= x d= 1 e= 0 f = 1 initial begin // non- blocking assignments 12 a= 1 b= 0 c= x d= 1 e= 0 f = 1 d <= #10 1; // e <= #2 0; // 16 a= 1 b= 0 c= 1 d= 1 e= 0 f = 1 f <= #4 1; // end initial begin $monitor($ time,," a= %b b= %b c= %b d= %b e= %b f= %b", a, b, c, d, e, f); #100 $finish; end endmodule
行为级建模
② 命名事件控制 用户在程序中声明 event(事件)类型变量,触发该变量,并识别 该事件是否已经发生 命名事件由关键字event声明,不能保存任何值 时间的触发用符号->表示;判断事件是否发生用@来识别
行为级建模
③ OR事件控制 多个信号或事件中发生的任意一个变化,都能够触发语句或语句块 的执行
行为级建模
行为级建模
inital语句
从仿真0时刻开始执行,在整个仿真过程中只执行一次。如果一个模 块中包含了若干个initial块,则这些块从0时刻开始并发执行,且每个 块的执行是各自独立的 如果在块中包含了多条行为语句,需要将这些语句组成一组。一般使 用关键字begin和 end将他们组合为一个块语句
行为级建模
行为级建模
生成块
行为级建模
生成实例可以是以下的一种或多种类型: 模块 用户自定义原语
门级原语
连续赋值语句 initial块和always块
行为级建模
分析:
程序是否正确?有哪些改进?
中间的for循环是否能被调用?为什么?
行为级建模
⑴ 循环生成语句
允许使用者对下面的模块或模块项进行多次实例引用:
行为级建模
设计复杂程度的不断提高 设计早期进行良好的整体规划 整体结构评估,建立在硬件所完成的算法之上 设计者从算法角度,即电路外部行为的角度进行描述 行为级建模:从一个很高的抽象角度来表示电路
行为级建模
行为级建模
结构化过程语句
两种结构化的过程语句:initial语句和 always语句,它们是行为级建模 的两种基本语句。 其他所有行为语句只能出现在这两种结构化过程语句里。 Verilog本质上是并发而非顺序的,每个语句代表一个独立的执行过程, 每个执行过程从仿真时间0开始,并且这两种语句不能嵌套使用
行为级建模
⑵ 条件生成语句
类似if-else-if的生成构造,可以在设计模块中依据表达式值的真假,决 定是否调用以下Verilog结构:
变量声明
模块 用户自定义原语、门级原语
连续赋值语句
initial块和always块
行为级建模
行为级建模
关键字generate-endgenerate来指定生成块的范围 仿真开始,先将生成块中的代码展平 关键词genvar用于声明生成变量,只能用在生成块中,确立后的仿真 代码中不存在 生成变量的值只能由循环生成语句来改变 循环生成语句可以嵌套,但是用同个生成变量作为索引的循环生成语句 不能相互嵌套 层次化引用xor_loop[0].g1, xor_loop[1].g1,……,xor_loop[31].g1
行为级建模
无限循环? 停止原因?
行为级建模
过程赋值语句
过程赋值语句的更新对象是寄存器、整数、实数或时间变量。这些类型 的变量被赋值后,其值将保持不变,直到被其它赋值语句赋予新值。过 程赋值语句只有在执行到的时候才起作用。
左侧的variable_lvalue可以是以下类型:
寄存器、整型数、实型数、时间存储器变量或存储器单元
块可以有自己的名字 命名块中可以声明局部变量 命名块是设计层次的一部分,命名块中声明的变量可以通过层次 名引用进行访问 命名块可以被禁用,例如停止执行
行为级建模
行为级建模
③ 命名块的禁用 关键字disable提供了一种终止命名块执行的方法。
disable可以用来从循环中退出、处理错误条件以及根据控制信号 来控制某些代码段是否被执行 与C语言中的break相比较
(阻塞、非阻塞对比)
阻塞与非阻塞赋值语句行为差别举例2波形
非阻塞
非阻塞
(阻塞、非阻塞对比)
(阻塞、非阻塞对比)
非阻塞语句并行执行,因此临时变量不可避免的在一个周期中被赋值, 在下一个周期中被采样
请见下页实例
(阻塞、非阻塞对比)
(阻塞、非阻塞对比)
(阻塞、非阻塞对比)
阻塞赋值or非阻塞赋值?
行为级建模
⑴ 顺序块
行为级建模
⑵ 并行块
行为级建模
并行块为我们提供了并行执行语句的机制,但如果两条语句在同一时 刻对同一变量影响,则会引起隐含的竞争这种情况要避免
行为级建模
块语句的三个特点:嵌套块、命名块和命名块的禁用
① 嵌套块 块可以嵌套使用,顺序块和并行块能够混合在一起使用
行为级建模
② 命名块
由关键字or连接的多个事件名或信号名组成的列表称为敏感列表
关键字or也可以用 “,” 替代
行为级建模
Verilog提供了另外两种符号:@* 和 @(*),都表示对其后语句块中 的所有输入变量的变化都是敏感的
行为级建模
行为级建模
⑶ 电平敏感时序控制
前面我们所讨论的事件控制都需要等待信号值的变化或事件的触发, 使用符号@和后面的敏感列表来表示 同时也允许使用另外一种形式表示的电平敏感时序控制(即后面的语 句和语句块需要等待某个条件为真才能执行) 关键字wait来表示等待电平敏感的条件为真
Leabharlann Baidu
行为级建模
⑵ 非阻塞赋值语句“<=”
非阻塞赋值语句允许赋值调度,但它不会阻塞位于同一个顺序块中 其后语句的执行
附注
行为级建模
行为级建模
非阻塞赋值语句的应用
非阻塞赋值语句可以用来为常见的硬件电路行为建模。如,当某事 发生时,多个数据并发传输
具体赋值流程?
与assign的区别?
行为级建模
非阻塞赋值语句的应用竞争
行为级建模
行为级建模
行为级建模
⑵ for 循环
注: while循环比for循环更通用,并不是所有情况下都能用for循环代替 while循环
行为级建模
for循环一般用于具有固定开始和结束条件的循环;如果只有一个执 行循环的条件,最好用while
行为级建模
⑶ repeat 循环
repeat循环的功能是执行固定次数的循环 循环的次数必须是一个常量、一个变量或一个信号 如果循环次数是变量或信号,取循环开始执行时变量或信号的值, 而不是循环执行期间的值
① 常规延迟控制
常规延迟控制位于赋值语句的左边,用于指定一个非零延迟值
延迟的是整个赋值语 句的进行
行为级建模
② 常规延迟控制
将延迟嵌入到赋值语句中,放在赋值符的右边
将表达式的值保存在临时变量中, 然后使用常规延迟控制赋值
行为级建模
③ 零延迟控制
零延迟控制可以保证带零延迟控制的语句将在执行时刻相同的多条语句 中最后执行,从而避免发生竞争。 但如果存在多条带有零延迟的语句,它们之间的执行顺序不确定的。
(阻塞、非阻塞对比)
阻塞与非阻塞赋值语句行为差别举例2
module pipeMult(product, mPlier, mCand, go, clock); input go, clock; input [7:0] mPlier, mCand; output [15:0] product; reg [15:0] product; always @(posedge go) product = repeat (4) @(posedge clock) mPlier * mCand; endmodule module pipeMult(product, mPlier, mCand, go, clock); input go, clock; input [7:0] mPlier, mCand; output [15:0] product; reg [15:0] product; always @(posedge go) product <= repeat (4) @(posedge clock) mPlier * mCand; endmodule
行为级建模
行为级建模
行为级建模
initial的用法之一
行为级建模
行为级建模
always语句
从仿真0时刻开始顺序执行其中的行为语句;最后一条语句执行完以 后,再次开始执行其中的第一条语句,如此循环往复,直至整个仿真 结束。 通常用于对数字电路中一组反复执行的活动进行建模,例如时钟信 号发生器
行为级建模
循环语句
循环语句的四种类型:while,for,repeat 和 forever 循环语句只能在 always 或 initial 块中使用,循环语句可以 包含延迟表达式 ⑴ while 循环 表达式的值为假,循环停止
如果执行到 while 语句时表达式已经为假,则一次也不执行
如果循环中有多条语句,则用 begin 和 end 组块
行为级建模
时序控制
行为级建模
⑴ 基于延迟的时序控制
基于延迟的时序控制出现在表达式中,它指定了语句开始执行到执行 完成之间的时间间隔 延迟字可以是数字、标示符或表达式,需要在延迟前加关键字“#”
对于过程赋值,Verilog提供了三种类型的延迟控制:常规延迟控制、 赋值内嵌延迟控制和零延迟控制
行为级建模
上述类型的位选/域选 (如,address[0], address[0:7]) 上述类型的拼接
包括两种类型:阻塞赋值和非阻塞赋值
行为级建模
⑴ 阻塞赋值语句“=”
串行块中的阻塞赋值语句按顺序执行,它不会阻塞其后并行块中语句的执行。
行为级建模
若赋值两端位宽不等,则: 1.如果右侧较宽,则保留从最 低位开始的右侧值,把超过左 侧位宽的高位丢弃 2.如果左侧位宽较宽,则不足 的高位补0