第五讲 行为建模1的重点

合集下载
相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

西安邮电学院通信工程系
延时执行例
module clk_gen_demo(clock1,clock2); output clock1,clock2; reg clock1,clock2; initial begin clock1=0; 若赋值延时为0,结果将 如何?
clock2=1;
end always begin #50 clock1=~clock1; end always begin #100 clock2=~clock2;
例:@(negedge clock) a=b;
@(敏感事件1 or 敏感事件2 or … ) – 敏感事件之一触发事件 例:@(posedge reset or posedge clear) reg_out=0;
@( a or b) c = a & b;
第五讲 行为建模
西安邮电学院通信工程系
边沿敏感事件的时序控制例
模块定义
module(port list)
时序特性
timig specifications
端口说明
Port declarations
数据类型说明
Data type declarations
电路功能描述
Circuit functionality
子程序
subprograms
输入
input
线网类型
net
模块实例
第五讲 行为建模
西安邮电学院通信工程系
过程中的块语句
块语句用来将多个语句组织在一起,使得他们在语法上如同一个语句。块 语句分为两类。 顺序块:语句置于关键字begin和end之间,块中的语句以顺序方式执行。
并行块:关键字fork和join之间的是并行块语句,块中的语句并行执行。
Fork和join语句常用于testbench描述。这是因为可以一起给出矢量及其 绝对时间,而不必描述所有先前事件的时间。
// 信号赋初值0 // 描述 clk // 描述 edgeo // 描述 waito
第五讲 行为建模
西安邮电学院通信工程系
仿真中行为描述例
在本例中发生下面顺序的事件: always wait (set)
1.
2. 3. 4.
等待set=1,忽略时刻10的clk的posedge。
等待下一个clk的posedge,它将在时刻30发生。 等待3个时间单位,在时刻33(30+3)置q=1。 等待10个时间单位,在时刻43(33+10)置q=0。
过程块中有下列部件
过程赋值语句:描述过程块中的数据流 时序控制:控制块的执行及块中的语句时序 高级结构(循环,条件语句等):描述块的功能
第五讲 行为建模
西安邮电学院通信工程系
过程块initial和always
都从0时刻开始执行;
initial无触发条件,只执 行一次;
module name(…)

fork:块名 … join
第五讲 行为建模
西安邮电学院通信工程系
过程的时序控制
在过程块中可以说明过程时序。过程时序控制有三类: 延时执行:#delay, 延迟指定时间步后执行语句 边沿敏感事件的时序控制:@(<signal>) 在信号发生翻转后执行语句。 可以说明信号有效沿是上升沿(posedge)还是下降沿 (negedge)。 可以用关键字or指定多个参数。 电平敏感事件的时序控制:wait(<expr>) 直至expr值为真时(非零)才执行语句。 若expr已经为真则立即执行语句。
always
begin #0 clock1=~clock1; end
end
endmodule
第五讲 行为建模
西安邮电学院通信工程系
块语句中的延时执行
在顺序块中,语句一条接一条地计算执行。 在并行块中,所有语句在各自的延迟之后立即计算执行。 begin #5 a = 3; #5 a = 5; #5 a = 4; end
begin
@( posedge clk) #3 q = 1; #10 q = 0; wait (! set);
5.
6. 7.
等待在时刻48发生的set=0。
等待在时刻70发生且与clk的上升沿同时发生的set=1。
end
等待下一个上升沿。时刻70的边沿被忽略,因为到达该语句时时间已经过去了,如例子所示, clk=1。
第五讲 行为建模
西安邮电学院通信工程系
有名块
有名块的块名作用: 便于实现对块语句的有效控制 用disable语句终止或提前结束有名块的执行过 程 允许在块内引入局部变量
格式: begin: 块名 … end
只在块内起作用的变量
变量名可以和块外的其他变量名相同 一定是寄存器类 例: begin: SEQ_BLK reg[3:0] sat sat = mask & data; ff = ^sat; end
module reg_ adder (out, a, b, clk); input clk; input [2: 0] a, b; output [3: 0] out; reg [3: 0] out; reg [3: 0] sum; always @( a or b) // 若a或b发生任何变化,执行 #5 sum = a + b; always @( negedge clk) // 在clk下降沿执行 out = sum; endmodule
系统任务和函数
System task & function
第五讲 行为建模
西安邮电学院通信工程系
行为建模(描述)
行为级描述是对系统的高抽象级描述。在这个抽象级,注重的是整个系统的功能 而不是实现。 Verilog有高级编程语言结构用于行为描述,包括:initial, always,@, wait, for, while, if else, case 和 forever 等。 Verilog的行为建模是用一系列以高级编程语言编写的并行的、动态的过程块来描 述系统的工作。
综合工具还不支持wait语句。
第五讲 行为建模
西安邮电学院通信工程系
过程的时序控制例
module wait_test; reg clk, waito, edgeo; initial begin clk = 0;edgeo=0;waito=0;end always #50 clk = ~clk; always @(clk) #10 edgeo = clk; always wait(clk) #10 waito = ~waito; endmodule
wk.baidu.comfork
#5 a = 3; #15 a = 4; #10 a = 5; join
上面的两个例子在功能上是等价的。Fork-join例子里的赋值故意打乱顺 序是为了强调顺序是没有关系的。
注意fork-join块是典型的不可综合语句,并且在一些仿真器中效率较差。
第五讲 行为建模
西安邮电学院通信工程系
第五讲 行为建模
西安邮电学院通信工程系
延时执行
语法:<定时控制> <寄存器变量>=<表达式>;
执行过程:定时控制 -> 求表达式 ->赋值
举例: #10 reg_a=reg_b; //延时10个单位后,执行赋值。 # 2 q= a & b; //延时2个单位后,求表达式,赋 //值。
与assign语句延时相似,为惯性延时。
第五讲 行为建模
西安邮电学院通信工程系
第 五讲 行为建模1
内容: 行为建模 过程块语句 过程赋值 过程中的块语句 过程的时序控制 阻塞与非阻塞过程赋值 时序仿真原理(竞争概念)
第五讲 行为建模
西安邮电学院通信工程系
行为建模(描述)
编译指令
Compiler directives
D触发器行为
在每一个时钟上升沿, 若Clr不是低电平, 置Q为D值, 置Qb为D值的反 无论何时Clr变低
置Q为0,
置Qb为1
第五讲 行为建模
西安邮电学院通信工程系
过程块(procedural)
过程块是行为模型的基础。一个模块中可以有多个过程块,过程块有两种:
initial块,只能执行一次 always块,循环执行
在延时执行中可以使用模块参数 parameter:
module clock_gen (clk); output clk; reg clk; parameter cycle = 20; initial clk = 0;
always
#(cycle/2) clk = ~clk; endmodule
第五讲 行为建模
且相互独立,并行运行。
endmodule
第五讲 行为建模
西安邮电学院通信工程系
过程赋值(procedural assignment)
在过程块中的赋值称为过程赋值。 在过程赋值语句中表达式左边的信号必须是寄存器类型(如reg类型) 在过程赋值语句等式右边可以是任何有效的表达式,数据类型也没有限制。 如果一个信号没有声明则缺省为wire类型。使用过程赋值语句给wire赋值会产生错 误。 module adder (out, a, b, cin); input a, b, cin; 时序控制 output [1:0] out; wire a, b, cin; reg half_sum; reg [1: 0] out; always @( a or b or cin) 顺序块语句 begin half_sum = a ^ b ^ cin ; // OK half_carry = a & b | a & !b & cin | !a & b & cin ; // ERROR! out = {half_carry, half_ sum} ; half_carry end 没有说明 endmodule
模块 reg_adder 描述了什么电路?
第五讲 行为建模
西安邮电学院通信工程系
电平敏感事件的时序控制
事件控制:wait(变量或表达式事件),等待直到事件为真(1)执 行后续语句。例:
module latch_adder (out, a, b, enable); input enable; input [2: 0] a, b; output [3: 0] out; reg [3: 0] out; always @( a or b) begin wait (!enable) // 当enable为低电平时执行加法 out = a + b; end endmodule
边沿敏感事件的时序控制
事件控制:@(事件控制敏感表),等待直到事件发生后执行。 @(信号名) – 信号名有变化就触发事件,例:@(clock) a=b;
@(posedge 信号名) – 信号名有上升沿就触发事件,
例:@(posedge clock) a=b; @(negedge 信号名) – 信号名有下降沿就触发事件
第五讲 行为建模
西安邮电学院通信工程系
延时执行
在testbench中使用延时执行(#延时)施加激励,或在行为模型中 模拟实际延时。
module muxtwo (out, a, b, sl);
input a, b, sl;
output out; reg out; always @( sl or a or b) if (! sl) #10 out = a; // 从a到out延时10个时间单位 else #12 out = b; //从b到out延时12个时间单位 endmodule
instantiation
任务
task
连续赋值 输出
output
过程块
Procedural blocks
寄存器类型
register
Continuous assignment
函数
function
双向
inout
参数
parameter
赋值语句
assign
过程块语句
initial block always block
input … output … reg …. // 信号说明 // 端口说明
Always按触发条件执行,或
无触发条件时一直执行; 一个module的行为描述中可 以有多个initial和always 语句,即有多个过程块存在,
wire …
// 功能描述 assign ….. // 并行赋值语句 initial …. always … initial …. assign …. always … // 过程块语句 // 过程块语句
相关文档
最新文档