Verilog HDL行为描述方式
发布时间:2008/5/28 0:00:00 访问次数:1553
设计的行为功能使用下述过程语句结构描述:
1) initial语句:此语句只执行一次。
2) always语句:此语句总是循环执行, 或者说此语句重复执行。
只有寄存器类型数据能够在这两种语句中被赋值。寄存器类型数据在被赋新值前保持原有值不变。所有的初始化语句和always语句在0时刻并发执行。
下例为always语句对1位全加器电路建模的示例。
module fa_seq (a, b, cin, sum, cout);
input a, b, cin;
output sum, cout;
reg sum, cout;
reg t1, t2, t3;
always
@ ( a or b or cin ) begin
sum = (a ^ b) ^ cin;
t1 = a & cin;
t2 = b & cin;
t3 = a & b;
cout = (t1 t2) t3;
end
endmodule
模块fa_seq 有三个输入和两个输出。由于sum、cout、t1、t2和t3在always 语句中被赋值,它们被说明为 reg 类型(reg 是寄存器数据类型的一种)。always 语句中有一个与事件控制(紧跟在字符@ 后面的表达式)。相关联的顺序过程(begin-end对)。这意味着只要a、b或cin 上发生事件,即a、b或cin之一的值发生变化,顺序过程就执行。在顺序过程中的语句顺序执行,并且在顺序过程执行结束后被挂起。顺序过程执行完成后,always 语句再次等待a、b或cin上发生的事件。
在顺序过程中出现的语句是过程赋值模块化的实例。模块化过程赋值在下一条语句执行前完成执行。过程赋值可以有一个可选的时延。
时延可以细分为两种类型:
1) 语句间时延: 这是时延语句执行的时延。
2) 语句内时延: 这是右边表达式数值计算与左边表达式赋值间的时延。
下面是语句间时延的示例:
sum = (a ^ b) ^ cin;
#4 t1 = a & cin;
在第二条语句中的时延规定赋值延迟4个时间单位执行。就是说,在第一条语句执行后等待4个时间单位,然后执行第二条语句。下面是语句内时延的示例。
sum = #3 (a^ b) ^ cin;
这个赋值中的时延意味着首先计算右边表达式的值, 等待3个时间单位,然后赋值给sum。
如果在过程赋值中未定义时延,缺省值为0时延,也就是说,赋值立即发生。这种形式以及在always 语句中指定语句的其他形式将在第8章中详细讨论。
下面是initial语句的示例:
`timescale 1ns / 1ns
module test (pop, pid);
output pop, pid;
reg pop, pid;
initial
begin
pop = 0; // 语句 1。
pid = 0; // 语句 2。
pop = #5 1; // 语句 3。
pid = #3 1; // 语句 4。
pop = #6 0; // 语句 5。
pid = #2 0; // 语句 6。
end
endmodule
initial语句包含一个顺序过程。这一顺序过程在0 ns时开始执行,并且在顺序过程中所有语句全部执行完毕后, initial语句永远挂起。这一顺序过程包含带有定义语句内时延的分组过程赋值的实例。语句1和2在0 ns时执行。第三条语句也在0时刻执行,导致pop 在第5 ns时被赋值。语句4在第5 ns执行,并且pid 在第8 ns被赋值。同样,pop在14 ns被赋值0,pid在第16 ns被赋值0。第6条语句执行后,initial语句永远被挂起。
1) initial语句:此语句只执行一次。
2) always语句:此语句总是循环执行, 或者说此语句重复执行。
只有寄存器类型数据能够在这两种语句中被赋值。寄存器类型数据在被赋新值前保持原有值不变。所有的初始化语句和always语句在0时刻并发执行。
下例为always语句对1位全加器电路建模的示例。
module fa_seq (a, b, cin, sum, cout);
input a, b, cin;
output sum, cout;
reg sum, cout;
reg t1, t2, t3;
always
@ ( a or b or cin ) begin
sum = (a ^ b) ^ cin;
t1 = a & cin;
t2 = b & cin;
t3 = a & b;
cout = (t1 t2) t3;
end
endmodule
模块fa_seq 有三个输入和两个输出。由于sum、cout、t1、t2和t3在always 语句中被赋值,它们被说明为 reg 类型(reg 是寄存器数据类型的一种)。always 语句中有一个与事件控制(紧跟在字符@ 后面的表达式)。相关联的顺序过程(begin-end对)。这意味着只要a、b或cin 上发生事件,即a、b或cin之一的值发生变化,顺序过程就执行。在顺序过程中的语句顺序执行,并且在顺序过程执行结束后被挂起。顺序过程执行完成后,always 语句再次等待a、b或cin上发生的事件。
在顺序过程中出现的语句是过程赋值模块化的实例。模块化过程赋值在下一条语句执行前完成执行。过程赋值可以有一个可选的时延。
时延可以细分为两种类型:
1) 语句间时延: 这是时延语句执行的时延。
2) 语句内时延: 这是右边表达式数值计算与左边表达式赋值间的时延。
下面是语句间时延的示例:
sum = (a ^ b) ^ cin;
#4 t1 = a & cin;
在第二条语句中的时延规定赋值延迟4个时间单位执行。就是说,在第一条语句执行后等待4个时间单位,然后执行第二条语句。下面是语句内时延的示例。
sum = #3 (a^ b) ^ cin;
这个赋值中的时延意味着首先计算右边表达式的值, 等待3个时间单位,然后赋值给sum。
如果在过程赋值中未定义时延,缺省值为0时延,也就是说,赋值立即发生。这种形式以及在always 语句中指定语句的其他形式将在第8章中详细讨论。
下面是initial语句的示例:
`timescale 1ns / 1ns
module test (pop, pid);
output pop, pid;
reg pop, pid;
initial
begin
pop = 0; // 语句 1。
pid = 0; // 语句 2。
pop = #5 1; // 语句 3。
pid = #3 1; // 语句 4。
pop = #6 0; // 语句 5。
pid = #2 0; // 语句 6。
end
endmodule
initial语句包含一个顺序过程。这一顺序过程在0 ns时开始执行,并且在顺序过程中所有语句全部执行完毕后, initial语句永远挂起。这一顺序过程包含带有定义语句内时延的分组过程赋值的实例。语句1和2在0 ns时执行。第三条语句也在0时刻执行,导致pop 在第5 ns时被赋值。语句4在第5 ns执行,并且pid 在第8 ns被赋值。同样,pop在14 ns被赋值0,pid在第16 ns被赋值0。第6条语句执行后,initial语句永远被挂起。
设计的行为功能使用下述过程语句结构描述:
1) initial语句:此语句只执行一次。
2) always语句:此语句总是循环执行, 或者说此语句重复执行。
只有寄存器类型数据能够在这两种语句中被赋值。寄存器类型数据在被赋新值前保持原有值不变。所有的初始化语句和always语句在0时刻并发执行。
下例为always语句对1位全加器电路建模的示例。
module fa_seq (a, b, cin, sum, cout);
input a, b, cin;
output sum, cout;
reg sum, cout;
reg t1, t2, t3;
always
@ ( a or b or cin ) begin
sum = (a ^ b) ^ cin;
t1 = a & cin;
t2 = b & cin;
t3 = a & b;
cout = (t1 t2) t3;
end
endmodule
模块fa_seq 有三个输入和两个输出。由于sum、cout、t1、t2和t3在always 语句中被赋值,它们被说明为 reg 类型(reg 是寄存器数据类型的一种)。always 语句中有一个与事件控制(紧跟在字符@ 后面的表达式)。相关联的顺序过程(begin-end对)。这意味着只要a、b或cin 上发生事件,即a、b或cin之一的值发生变化,顺序过程就执行。在顺序过程中的语句顺序执行,并且在顺序过程执行结束后被挂起。顺序过程执行完成后,always 语句再次等待a、b或cin上发生的事件。
在顺序过程中出现的语句是过程赋值模块化的实例。模块化过程赋值在下一条语句执行前完成执行。过程赋值可以有一个可选的时延。
时延可以细分为两种类型:
1) 语句间时延: 这是时延语句执行的时延。
2) 语句内时延: 这是右边表达式数值计算与左边表达式赋值间的时延。
下面是语句间时延的示例:
sum = (a ^ b) ^ cin;
#4 t1 = a & cin;
在第二条语句中的时延规定赋值延迟4个时间单位执行。就是说,在第一条语句执行后等待4个时间单位,然后执行第二条语句。下面是语句内时延的示例。
sum = #3 (a^ b) ^ cin;
这个赋值中的时延意味着首先计算右边表达式的值, 等待3个时间单位,然后赋值给sum。
如果在过程赋值中未定义时延,缺省值为0时延,也就是说,赋值立即发生。这种形式以及在always 语句中指定语句的其他形式将在第8章中详细讨论。
下面是initial语句的示例:
`timescale 1ns / 1ns
module test (pop, pid);
output pop, pid;
reg pop, pid;
initial
begin
pop = 0; // 语句 1。
pid = 0; // 语句 2。
pop = #5 1; // 语句 3。
pid = #3 1; // 语句 4。
pop = #6 0; // 语句 5。
pid = #2 0; // 语句 6。
end
endmodule
initial语句包含一个顺序过程。这一顺序过程在0 ns时开始执行,并且在顺序过程中所有语句全部执行完毕后, initial语句永远挂起。这一顺序过程包含带有定义语句内时延的分组过程赋值的实例。语句1和2在0 ns时执行。第三条语句也在0时刻执行,导致pop 在第5 ns时被赋值。语句4在第5 ns执行,并且pid 在第8 ns被赋值。同样,pop在14 ns被赋值0,pid在第16 ns被赋值0。第6条语句执行后,initial语句永远被挂起。
1) initial语句:此语句只执行一次。
2) always语句:此语句总是循环执行, 或者说此语句重复执行。
只有寄存器类型数据能够在这两种语句中被赋值。寄存器类型数据在被赋新值前保持原有值不变。所有的初始化语句和always语句在0时刻并发执行。
下例为always语句对1位全加器电路建模的示例。
module fa_seq (a, b, cin, sum, cout);
input a, b, cin;
output sum, cout;
reg sum, cout;
reg t1, t2, t3;
always
@ ( a or b or cin ) begin
sum = (a ^ b) ^ cin;
t1 = a & cin;
t2 = b & cin;
t3 = a & b;
cout = (t1 t2) t3;
end
endmodule
模块fa_seq 有三个输入和两个输出。由于sum、cout、t1、t2和t3在always 语句中被赋值,它们被说明为 reg 类型(reg 是寄存器数据类型的一种)。always 语句中有一个与事件控制(紧跟在字符@ 后面的表达式)。相关联的顺序过程(begin-end对)。这意味着只要a、b或cin 上发生事件,即a、b或cin之一的值发生变化,顺序过程就执行。在顺序过程中的语句顺序执行,并且在顺序过程执行结束后被挂起。顺序过程执行完成后,always 语句再次等待a、b或cin上发生的事件。
在顺序过程中出现的语句是过程赋值模块化的实例。模块化过程赋值在下一条语句执行前完成执行。过程赋值可以有一个可选的时延。
时延可以细分为两种类型:
1) 语句间时延: 这是时延语句执行的时延。
2) 语句内时延: 这是右边表达式数值计算与左边表达式赋值间的时延。
下面是语句间时延的示例:
sum = (a ^ b) ^ cin;
#4 t1 = a & cin;
在第二条语句中的时延规定赋值延迟4个时间单位执行。就是说,在第一条语句执行后等待4个时间单位,然后执行第二条语句。下面是语句内时延的示例。
sum = #3 (a^ b) ^ cin;
这个赋值中的时延意味着首先计算右边表达式的值, 等待3个时间单位,然后赋值给sum。
如果在过程赋值中未定义时延,缺省值为0时延,也就是说,赋值立即发生。这种形式以及在always 语句中指定语句的其他形式将在第8章中详细讨论。
下面是initial语句的示例:
`timescale 1ns / 1ns
module test (pop, pid);
output pop, pid;
reg pop, pid;
initial
begin
pop = 0; // 语句 1。
pid = 0; // 语句 2。
pop = #5 1; // 语句 3。
pid = #3 1; // 语句 4。
pop = #6 0; // 语句 5。
pid = #2 0; // 语句 6。
end
endmodule
initial语句包含一个顺序过程。这一顺序过程在0 ns时开始执行,并且在顺序过程中所有语句全部执行完毕后, initial语句永远挂起。这一顺序过程包含带有定义语句内时延的分组过程赋值的实例。语句1和2在0 ns时执行。第三条语句也在0时刻执行,导致pop 在第5 ns时被赋值。语句4在第5 ns执行,并且pid 在第8 ns被赋值。同样,pop在14 ns被赋值0,pid在第16 ns被赋值0。第6条语句执行后,initial语句永远被挂起。