行为级建模分析
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
在这个例子中用initial语句在仿真开始时对各变量进行初始化。 initial begin inputs = 'b000000; //初始时刻为0 #10 inputs = 'b011001; #10 inputs = 'b011011; #10 inputs = 'b011000; #10 inputs = 'b001000; end 从这个例子中,我们可以看到用initial语句来生成激励波形作为 电路的测试仿真信号。
阻塞(Blocking)赋值方式( 如 b = a; ) ,其中b的值在赋值语句执行完后立刻 就改变的。
x = 0执行完成之后,才会执行y = 1 仿真0时刻执行 仿真时刻15执行 仿真时刻25执行
1.如果右侧表达式的位宽较宽,则将保留从最低位开始的右侧值,把 超过左侧位宽的高位丢弃; 2.如果左侧位宽大于右侧位宽,则不足的高位补0;
alwayΒιβλιοθήκη Baidu语句声明格式如下:
always <时序控制> <语句>
Page 6
如果一个always语句没有时序控制,则这个always语句将会发成一个 仿真死锁。见下例: always areg = ~areg;
这个always语句将会生成一个0延迟的无限循环跳变过程,这时会发生 仿真死锁。如果加上时序控制,则这个always语句将变为一条非常有用的 描述语句。见下例:
Page 11
使用非阻塞赋值来避免竞争
产生了竞争的情况:a = b和b = a,具体执行顺序的先后取决于 所使用的仿真器,因此这段代 码达不到交换a和b值的目的 。 在每个时钟上升沿到来的时候, 仿真器读取每个操作数的值, 进而计算表达式的值并保存在 临时变量中;当赋值的时候, 仿真器将这些保存的值赋予非 阻塞赋值语句的左侧变量。
每个initial语句和always语句代表一个独立的执行过程,每个执行过程从仿 真时间0开始执行,并且这两种语句不能嵌套使用。
Page 2
7.1.1 initial语句
所有在initial语句内的语句构成了一个initial块。initial块从仿真0时刻开始执 行,在整个仿真过程中只执行一次。 如果一个模块中包括了若干个initial块,则这些initial块从仿真0时刻开始并 发执行,且每个块的执行是各自独立的。 如果在块内包含了多条行为语句,那么需要将这些语句组成一组,一般是 使用关键字begin和end将它们组合为一个块语句;如果块内只有一条语句, 则不必使用begin和end。
由于initial块语句在整个仿真期间只能执行一次,因此它一般被用于初始化、 信号监视、生成仿真波形等目的。
Page 3
Page 4
initial begin areg=0; //初始化寄存器areg for(index=0;index<size;index=index+1) memory[index]=0; //初始化一个memory end
always #half_period areg = ~areg; 这个例子生成了一个周期为:period(=2*half_period) 的无限延续的信号 波形,常用这种方法来描述时钟信号,作为激励信号来测试所设计的电路。
Page 7
7.2 过程赋值语句
过程赋值语句的更新对象是寄存器、整数、实数或时间变量。这些类型的 变量在被赋值后,其值将保持不变,直到被其他过程赋值语句赋予新值。 用法: 过程赋值语句的左侧值可以是: 1. reg,整型数、实型数、时间寄存器变量或存储器单元。
Page 5
7.1.2 always语句
always语句包括的所有行为语句构成了一个always语句块。该always语句 块从仿真0时刻开始顺序执行其中的行为语句;在最后一条执行完成后,再 次开始执行其中的第一条语句,如此循环往复,直至整个仿真结束。
always语句通常用于对数字电路中一组反复执行的活动进行建模。例如时 钟信号发生器,每半个时钟周期时钟信号翻转一次。在现实电路中只要电 源接通,时钟信号发生器从时刻0就有效,一直工作下去。
Page 9
7.2.2 非阻塞赋值语句
非阻塞赋值使用“<=”作为赋值符。
非阻塞(Non_Blocking)赋值方式( 如 b <= a; )。在语句块中,上面语句 所赋的变量并不能立即为下面的赋值语句使用;所赋变量值为上一次赋值得 到的。
仿真0时刻执行 仿真时刻15执行 仿真时刻10执行 仿真0时刻执行 reg_a[2]<= #15 1’b1; reg_b[15:13]<= #10 {x,y,z};
HDL语言硬件设计
第七章 行为级建模
7.1 结构化过程语句
在Verilog中有两种结构化的过程语句:initial语句和always语句,它们是 行为级建模的两种基本语句。其他所有的行为语句只能出现在这两种结构 化过程语句里。
与C语言不同,Verilog在本质上是并发而非顺序的。Verilog中的各个执行 流程(进程)并发执行,而不是顺序执行的。
2. 上述各种类型的位选(例如,addr [ 0 ])。
3. 上述各种类型的域选(例如,addr [ 31 : 16 ])。 上面三种类型的拼接。
Verilog包括两种类型的过程赋值语句:阻塞赋值和非阻塞赋值语句
Page 8
7.2.1 阻塞赋值语句
阻塞赋值语句使用“=”作为赋值符,在一个begin-end块中表现为串行行 为。
注意:不要在同一个always块中混合使用阻塞和非阻塞赋值语句。
Page 10
非阻塞赋值语句的应用
对程序:
如下的特点:
1.在每个时钟上升沿到来时读取in1,in2,in3和reg1,计算右侧表达式的值,该值 由仿真器临时保存。
2.对左值的赋值由仿真器调度到相应的仿真时刻,延迟时间由语句中内嵌的延迟值 确定。在本例中,对reg1的赋值需要等一个时间单位,对reg2的赋值需要等到时钟 信号下降沿到来的时刻,对reg3的赋值需要等一个时间单位; 3.每个赋值操作在被调度的仿真时刻完成。注意,对左侧变量的赋值使用的是由仿 真器保存的表达式“旧值”。在本例中,对reg3赋值使用的是reg1的“旧值”,而 不是在此之前对reg1赋予的新值,reg1的“旧值”是在赋值事件调度时由仿真器保 存的。
阻塞(Blocking)赋值方式( 如 b = a; ) ,其中b的值在赋值语句执行完后立刻 就改变的。
x = 0执行完成之后,才会执行y = 1 仿真0时刻执行 仿真时刻15执行 仿真时刻25执行
1.如果右侧表达式的位宽较宽,则将保留从最低位开始的右侧值,把 超过左侧位宽的高位丢弃; 2.如果左侧位宽大于右侧位宽,则不足的高位补0;
alwayΒιβλιοθήκη Baidu语句声明格式如下:
always <时序控制> <语句>
Page 6
如果一个always语句没有时序控制,则这个always语句将会发成一个 仿真死锁。见下例: always areg = ~areg;
这个always语句将会生成一个0延迟的无限循环跳变过程,这时会发生 仿真死锁。如果加上时序控制,则这个always语句将变为一条非常有用的 描述语句。见下例:
Page 11
使用非阻塞赋值来避免竞争
产生了竞争的情况:a = b和b = a,具体执行顺序的先后取决于 所使用的仿真器,因此这段代 码达不到交换a和b值的目的 。 在每个时钟上升沿到来的时候, 仿真器读取每个操作数的值, 进而计算表达式的值并保存在 临时变量中;当赋值的时候, 仿真器将这些保存的值赋予非 阻塞赋值语句的左侧变量。
每个initial语句和always语句代表一个独立的执行过程,每个执行过程从仿 真时间0开始执行,并且这两种语句不能嵌套使用。
Page 2
7.1.1 initial语句
所有在initial语句内的语句构成了一个initial块。initial块从仿真0时刻开始执 行,在整个仿真过程中只执行一次。 如果一个模块中包括了若干个initial块,则这些initial块从仿真0时刻开始并 发执行,且每个块的执行是各自独立的。 如果在块内包含了多条行为语句,那么需要将这些语句组成一组,一般是 使用关键字begin和end将它们组合为一个块语句;如果块内只有一条语句, 则不必使用begin和end。
由于initial块语句在整个仿真期间只能执行一次,因此它一般被用于初始化、 信号监视、生成仿真波形等目的。
Page 3
Page 4
initial begin areg=0; //初始化寄存器areg for(index=0;index<size;index=index+1) memory[index]=0; //初始化一个memory end
always #half_period areg = ~areg; 这个例子生成了一个周期为:period(=2*half_period) 的无限延续的信号 波形,常用这种方法来描述时钟信号,作为激励信号来测试所设计的电路。
Page 7
7.2 过程赋值语句
过程赋值语句的更新对象是寄存器、整数、实数或时间变量。这些类型的 变量在被赋值后,其值将保持不变,直到被其他过程赋值语句赋予新值。 用法: 过程赋值语句的左侧值可以是: 1. reg,整型数、实型数、时间寄存器变量或存储器单元。
Page 5
7.1.2 always语句
always语句包括的所有行为语句构成了一个always语句块。该always语句 块从仿真0时刻开始顺序执行其中的行为语句;在最后一条执行完成后,再 次开始执行其中的第一条语句,如此循环往复,直至整个仿真结束。
always语句通常用于对数字电路中一组反复执行的活动进行建模。例如时 钟信号发生器,每半个时钟周期时钟信号翻转一次。在现实电路中只要电 源接通,时钟信号发生器从时刻0就有效,一直工作下去。
Page 9
7.2.2 非阻塞赋值语句
非阻塞赋值使用“<=”作为赋值符。
非阻塞(Non_Blocking)赋值方式( 如 b <= a; )。在语句块中,上面语句 所赋的变量并不能立即为下面的赋值语句使用;所赋变量值为上一次赋值得 到的。
仿真0时刻执行 仿真时刻15执行 仿真时刻10执行 仿真0时刻执行 reg_a[2]<= #15 1’b1; reg_b[15:13]<= #10 {x,y,z};
HDL语言硬件设计
第七章 行为级建模
7.1 结构化过程语句
在Verilog中有两种结构化的过程语句:initial语句和always语句,它们是 行为级建模的两种基本语句。其他所有的行为语句只能出现在这两种结构 化过程语句里。
与C语言不同,Verilog在本质上是并发而非顺序的。Verilog中的各个执行 流程(进程)并发执行,而不是顺序执行的。
2. 上述各种类型的位选(例如,addr [ 0 ])。
3. 上述各种类型的域选(例如,addr [ 31 : 16 ])。 上面三种类型的拼接。
Verilog包括两种类型的过程赋值语句:阻塞赋值和非阻塞赋值语句
Page 8
7.2.1 阻塞赋值语句
阻塞赋值语句使用“=”作为赋值符,在一个begin-end块中表现为串行行 为。
注意:不要在同一个always块中混合使用阻塞和非阻塞赋值语句。
Page 10
非阻塞赋值语句的应用
对程序:
如下的特点:
1.在每个时钟上升沿到来时读取in1,in2,in3和reg1,计算右侧表达式的值,该值 由仿真器临时保存。
2.对左值的赋值由仿真器调度到相应的仿真时刻,延迟时间由语句中内嵌的延迟值 确定。在本例中,对reg1的赋值需要等一个时间单位,对reg2的赋值需要等到时钟 信号下降沿到来的时刻,对reg3的赋值需要等一个时间单位; 3.每个赋值操作在被调度的仿真时刻完成。注意,对左侧变量的赋值使用的是由仿 真器保存的表达式“旧值”。在本例中,对reg3赋值使用的是reg1的“旧值”,而 不是在此之前对reg1赋予的新值,reg1的“旧值”是在赋值事件调度时由仿真器保 存的。