当前位置:文档之家› 第三章EDA_行为级建模

第三章EDA_行为级建模


行为级建模
行为级建模
⑷ forever 循环
永久循环,执行无限的循环直到遇到系统任务 $finish
如果需要从 forever 循环中退出,可以使用 disable 语句 通常forever循环和时序控制结构结合使用
行为级建模
顺序块和并行块
块语句的作用? ቤተ መጻሕፍቲ ባይዱ为级块语句的两种类型:顺序块和并行块
① 常规延迟控制
常规延迟控制位于赋值语句的左边,用于指定一个非零延迟值
延迟的是整个赋值语 句的进行
行为级建模
② 常规延迟控制
将延迟嵌入到赋值语句中,放在赋值符的右边
将表达式的值保存在临时变量中, 然后使用常规延迟控制赋值
行为级建模
③ 零延迟控制
零延迟控制可以保证带零延迟控制的语句将在执行时刻相同的多条语句 中最后执行,从而避免发生竞争。 但如果存在多条带有零延迟的语句,它们之间的执行顺序不确定的。
行为级建模
⑵ 条件生成语句
类似if-else-if的生成构造,可以在设计模块中依据表达式值的真假,决 定是否调用以下Verilog结构:
怎样修改?
行为级建模
使用阻塞赋值来达到非阻塞赋值的目的(修改前页)
(阻塞、非阻塞对比)
阻塞与非阻塞赋值语句行为差别举例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
行为级建模
行为级建模
生成块
行为级建模
生成实例可以是以下的一种或多种类型: 模块 用户自定义原语
门级原语
连续赋值语句 initial块和always块
行为级建模
分析:
程序是否正确?有哪些改进?
中间的for循环是否能被调用?为什么?
行为级建模
⑴ 循环生成语句
允许使用者对下面的模块或模块项进行多次实例引用:
行为级建模
时序控制
行为级建模
⑴ 基于延迟的时序控制
基于延迟的时序控制出现在表达式中,它指定了语句开始执行到执行 完成之间的时间间隔 延迟字可以是数字、标示符或表达式,需要在延迟前加关键字“#”
对于过程赋值,Verilog提供了三种类型的延迟控制:常规延迟控制、 赋值内嵌延迟控制和零延迟控制
行为级建模
在实际设计中,尽量 不要使用零延迟控制
行为级建模
⑵ 基于事件的时序控制
事件:指某个寄存器或线网变量的值发生了变化。 事件可以用来触发声明语句或块语句的执行。 4种类型的事件控制:常规事件控制、命名事件控制、OR(或)事件控 制和电平敏感时序控制 ① 常规事件控制 使用符号@来标明,语句继续执行的条件是信号发生变化、正跳 变或负跳变 posedge用于指明正向跳变,negedge用于指明负向跳变
行为级建模
② 命名事件控制 用户在程序中声明 event(事件)类型变量,触发该变量,并识别 该事件是否已经发生 命名事件由关键字event声明,不能保存任何值 时间的触发用符号->表示;判断事件是否发生用@来识别
行为级建模
③ OR事件控制 多个信号或事件中发生的任意一个变化,都能够触发语句或语句块 的执行
行为级建模
设计复杂程度的不断提高 设计早期进行良好的整体规划 整体结构评估,建立在硬件所完成的算法之上 设计者从算法角度,即电路外部行为的角度进行描述 行为级建模:从一个很高的抽象角度来表示电路
行为级建模
行为级建模
结构化过程语句
两种结构化的过程语句:initial语句和 always语句,它们是行为级建模 的两种基本语句。 其他所有行为语句只能出现在这两种结构化过程语句里。 Verilog本质上是并发而非顺序的,每个语句代表一个独立的执行过程, 每个执行过程从仿真时间0开始,并且这两种语句不能嵌套使用
行为级建模
⑴ 顺序块
行为级建模
⑵ 并行块
行为级建模
并行块为我们提供了并行执行语句的机制,但如果两条语句在同一时 刻对同一变量影响,则会引起隐含的竞争这种情况要避免
行为级建模
块语句的三个特点:嵌套块、命名块和命名块的禁用
① 嵌套块 块可以嵌套使用,顺序块和并行块能够混合在一起使用
行为级建模
② 命名块
变量声明
模块 用户自定义原语、门级原语
连续赋值语句
initial块和always块
行为级建模
行为级建模
关键字generate-endgenerate来指定生成块的范围 仿真开始,先将生成块中的代码展平 关键词genvar用于声明生成变量,只能用在生成块中,确立后的仿真 代码中不存在 生成变量的值只能由循环生成语句来改变 循环生成语句可以嵌套,但是用同个生成变量作为索引的循环生成语句 不能相互嵌套 层次化引用xor_loop[0].g1, xor_loop[1].g1,……,xor_loop[31].g1
行为级建模
无限循环? 停止原因?
行为级建模
过程赋值语句
过程赋值语句的更新对象是寄存器、整数、实数或时间变量。这些类型 的变量被赋值后,其值将保持不变,直到被其它赋值语句赋予新值。过 程赋值语句只有在执行到的时候才起作用。
左侧的variable_lvalue可以是以下类型:
寄存器、整型数、实型数、时间存储器变量或存储器单元
行为级建模
行为级建模
行为级建模
⑵ 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
(阻塞、非阻塞对比)
阻塞与非阻塞赋值语句行为差别举例2波形
非阻塞
非阻塞
(阻塞、非阻塞对比)
(阻塞、非阻塞对比)
非阻塞语句并行执行,因此临时变量不可避免的在一个周期中被赋值, 在下一个周期中被采样
请见下页实例
(阻塞、非阻塞对比)
(阻塞、非阻塞对比)
(阻塞、非阻塞对比)
阻塞赋值or非阻塞赋值?
上述类型的位选/域选 (如,address[0], address[0:7]) 上述类型的拼接
包括两种类型:阻塞赋值和非阻塞赋值
行为级建模
⑴ 阻塞赋值语句“=”
串行块中的阻塞赋值语句按顺序执行,它不会阻塞其后并行块中语句的执行。
行为级建模
若赋值两端位宽不等,则: 1.如果右侧较宽,则保留从最 低位开始的右侧值,把超过左 侧位宽的高位丢弃 2.如果左侧位宽较宽,则不足 的高位补0
行为级建模
行为级建模
选择信号中有不确定值x,则输出为x 选择信号中有高阻值z,则输出为z 选择信号中一位为x,另外一位为z,则x的优先级高
行为级建模
casex 和 casez 关键字
casez语句将条件表达式或候选项表达式中的z作为无关值,所有值为 z的位也可以用“?”表示 casex语句将条件表达式或候选项表达式中的x作为无关值
行为级建模
循环语句
循环语句的四种类型:while,for,repeat 和 forever 循环语句只能在 always 或 initial 块中使用,循环语句可以 包含延迟表达式 ⑴ while 循环 表达式的值为假,循环停止
相关主题