Verilog行为仿真
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
用户定义的原语
用户自定义元件
利用UDP(User Defined Primitives)用户可以自己定义基本逻 ( 利用 ) 辑元件的功能, 辑元件的功能,用户可以象调用基本门元件一样来调用这些自己定义的 元件。 元件。 UDP关键词为 关键词为primitive和endprimitive。与一般的模块相比, 关键词为 和 。与一般的模块相比, UDP模块具有下面一些特点: 模块具有下面一些特点: 模块具有下面一些特点 的输出端口只能有一个, ◆ UDP的输出端口只能有一个,且必须位于端口列表的第一项。只 的输出端口只能有一个 且必须位于端口列表的第一项。 有输出端口能被定义为reg类型。 类型。 有输出端口能被定义为 类型 的输入端口可有多个, ◆ UDP的输入端口可有多个,一般时序电路 的输入端口可有多个 一般时序电路UDP的输入端口可多至 的输入端口可多至 9个,组合电路UDP的输入端口可多至 个。 个 组合电路 的输入端口可多至10个 的输入端口可多至 所有的端口变量必须是1位标量 位标量。 ◆ 所有的端口变量必须是 位标量。 表项中, 三种状态, 状态。 ◆ 在table表项中,只能出现 、1、x三种状态,不能出现 状态。 表项中 只能出现0、 、 三种状态 不能出现z状态
6.$random 和文件操作 .
$random: : 产生随机数的系统函数,每次调用该函数将返回一个32 产生随机数的系统函数,每次调用该函数将返回一个 位的随机数,该随机数是一个带符号的整数。 位的随机数,该随机数是一个带符号的整数。
一般用法为: 一般用法为: $random % b 其中b>0,它给出了一个范围在0~b-1之间的随机数。 ,它给出了一个范围在 之间的随机数。 其中 之间的随机数 $random%15通过位拼接操作,产生一个0~14之间的随机数。 通过位拼接操作,产生一个 之间的随机数。 通过位拼接操作 之间的随机数
格式控制符
格式控制符 %h或%H 或 %d或%D 或 %o或 %o或%O %b或%B 或 %c或%C 或 %v或%V 或 %m或%M 或 %s或%S 或 %t或%T 或 说明 转义字符 以16进制形式显示 进制形式显示 \n 以10进制形式显示 进制形式显示 \t 8进制形式显示 以8进制形式显示 以2进制形式显示 进制形式显示 以ASCII字符形式显示 字符形式显示 显示net型数据的驱动强度 型数据的驱动强度 显示 显示层次名 以字符串形式输出 以当前的时间格式显示 \\ \“ \ ddd %%
完整的Test Fixture
module testfixture; 结果输出 // 数据类型说明 0 o= 0 a= 0 b= 1 reg a, b, s; wire o; 5 o= 0 a= 0 b= 0 // MUX实例化Biblioteka Baidu实例化 10 o= 1 a= 0 b= 1 MUX2_1 mux (o, a, b, s); // 施加激励 15 o= 1 a= 1 b= 1 initial begin a = 0; b = 1; s = 0; #5 b = 0; #5 b = 1; s = 1; #5 a = 1; #5 $finish; end // 显示结果 initial $monitor($time,," o=%b a=%b b=%b s=%b", o, a, b, s); endmodule
•
DUT 被测器件 (device under test)
module MUX2_1 ( output wire out, input wire a, b, sel ); wire sel, a1, b1;
• a, b, sel是输入端口,out是输出 是输入端口, 是输入端口 是输出 端口。 端口。所有信号通过这些端口从模 块输入/输出 输出。 块输入 输出。 另一个模块可以通过模块名及端口 说明使用多路器。 说明使用多路器。实例化多路器时 不需要知道其实现细节。 不需要知道其实现细节。这正是自 上而下设计方法的一个重要特点。 上而下设计方法的一个重要特点。 模块的实现可以是行为级也可以是 门级, 门级,但并不影响高层次模块对它 的使用。 的使用。
Test fixture 激励描述
module testfixture; // Data type declaration reg a, b, s; wire o; // MUX instance MUX2_1 mux (o, a, b, s); // Apply stimulus initial begin a = 0; b = 1; s = 0; #5 b = 0; • #5 b = 1; s = 1; #5 a = 1; #5 $finish; end • // Display results • endmodule Time 0 5 10 15 Values a b s 0 1 0 0 0 0 0 1 1 1 1 1
•
// The netlist not (sel_, sel); and (a1, a, sel_); and (b1, b, sel); or (out, a1, b1); endmodule 已定义的 Verilog基 基 本单元的 实例
Test Fixture template
module testfixture; // Data type declaration
为什么没 有端口? 有端口?
// Instantiate modules
// Apply stimulus
// Display results
由于testfixture是最顶层模 是最顶层模 由于 不会被其它模块实例化。 块,不会被其它模块实例化。 因此不需要有端口。 因此不需要有端口。
endmodule
4.$finish与$stop . 与
系统任务$finish与$stop用于对仿真过程进行控制,分 与 用于对仿真过程进行控制, 系统任务 用于对仿真过程进行控制 别表示结束仿真和中断仿真。 别表示结束仿真和中断仿真。 $finish与$stop 的使用格式如下: 的使用格式如下: 与 $stop; $stop(n); $finish; $finish(n); n是$finish和$stop的参数,n 可以是 、1、2等值,分 的参数, 可以是0、 、 等值 等值, 是 和 的参数 别表示如下含义。 别表示如下含义。 0:不输出任何信息; :不输出任何信息; 1:给出仿真时间和位置; :给出仿真时间和位置; 2:给出仿真时间和位置,还有其他一些运行统计数据。 :给出仿真时间和位置,还有其他一些运行统计数据。
例子中, s说明为reg类数据 说明为reg类数据。 例子中,a, b, s说明为reg类数据。reg 类数据是寄存器类数据信号, 类数据是寄存器类数据信号,在重新赋值 前一直保持当前数据。 前一直保持当前数据。 用于指示等待5个时间单位。 #5 用于指示等待5个时间单位。 是结束仿真的系统任务。 $finish是结束仿真的系统任务。
第10章 章 Verilog行为仿真 Verilog行为仿真
测试程序TestBench 测试程序
一个完整的简单例子 test fixture
•
被测试器件DUT是一个二选一多路器。测试程序(test fixture)提 是一个二选一多路器。测试程序 被测试器件 是一个二选一多路器 提 供测试激励及验证机制。 供测试激励及验证机制。 Test fixture使用行为级描述,DUT采用门级描述。下面将给出 使用行为级描述, 采用门级描述。 使用行为级描述 采用门级描述 Test fixture的描述、DUT的描述及如何进行混合仿真。 的描述、 的描述及如何进行混合仿真。 的描述 的描述及如何进行混合仿真
1.$display与$write . 与
$display和$write是两个系统任务,两者的功能相同, 和 是两个系统任务, 是两个系统任务 两者的功能相同, 都用于显示模拟结果,其区别是 都用于显示模拟结果,其区别是$display在输出结束后 在输出结束后 能自动换行, 不能。 能自动换行,而$write不能。 不能 $display和$write的使用格式为: 和 的使用格式为: 的使用格式为 $display(“格式控制符”,输出变量名列表); ( 格式控制符” 输出变量名列表); $write(“格式控制符”,输出变量名列表); ( 格式控制符” 输出变量名列表);
转义字符
说明 换行 TAB键 键 符号\ 符号 符号“ 符号“ 八进制数ddd对应的 对应的ASCII字符 八进制数 对应的 字符 符号% 符号
2.$monitor与$strobe . 与
$monitor、$strobe与$display、$write一样也是属 、 与 、 一样也是属 于输出控制类的系统任务, 于输出控制类的系统任务,$monitor与$strobe都提供 与 都提供 了监控和输出参数列表中字符或变量的值的功能,其使 了监控和输出参数列表中字符或变量的值的功能, 用格式为: 用格式为: $monitor(“格式控制符”,输出变量名列表); 格式控制符” 输出变量名列表 格式控制符 $strobe(“格式控制符”,输出变量名列表); 格式控制符” 输出变量名列表 格式控制符 这里的格式控制符、输出变量名列表与 这里的格式控制符、输出变量名列表与$display和 和 $write中定义的完全相同。 中定义的完全相同。 中定义的完全相同
文件操作: 文件操作:
语言类似, 也提供了很多文件输出类的系统任务, 与c 语言类似,Verilog也提供了很多文件输出类的系统任务,可 也提供了很多文件输出类的系统任务 将结果输出到文件中。这类任务有: 将结果输出到文件中。这类任务有: $fopen用于打开某个文件并准备写操作, 用于打开某个文件并准备写操作, 用于打开某个文件并准备写操作 $fclose用于关闭文件, 用于关闭文件, 用于关闭文件 $fdisplay、$fwrite、$fmonitor等系统任务则用于把文本写入文 、 、 等系统任务则用于把文本写入文 件。
s= 0 s= 0 s= 1 s= 1
系统任务与系统函数
系统任务和系统函数一般以符号“ 开头 例如: 开头。 ◆ 系统任务和系统函数一般以符号“$”开头。例如: $monitor,$finish等。 , 等 使用不同的Verilog仿真工具(如:VCS、Verilog-XL、 仿真工具( ◆ 使用不同的 仿真工具 、 、 ModelSim等)进行仿真时,这些系统任务和系统函数在 等 进行仿真时, 使用方法上可能存在差异,应根据使用手册来使用。 使用方法上可能存在差异,应根据使用手册来使用。 一般在intial或always过程块中,调用系统任务和系统 过程块中, ◆ 一般在 或 过程块中 函数。 函数。 用户可以通过编程语言接口( ◆ 用户可以通过编程语言接口(PLI)将自己定义的系统 ) 任务和系统函数加到语言中,以进行仿真和调试。 任务和系统函数加到语言中,以进行仿真和调试。
Test Fixture — 如何说明实例
module MUX2_1 (out, a, b, sel); // Port declarations module testfixture; output out; // Data type declaration input a, b, sel; wire out, a, b, sel; wire sel_, a1, b1; // Instantiate modules // The netlist MUX2_1 mux (o, a, b, s); not (sel_, sel); and (a1, a, sel_); // MUX2_1 mux (.out(o), .a(a), .b(b), .sel(s)); and (b1, b, sel); // Apply stimulus or (out, a1, b1); endmodule // Display results MUX的实例化语句包括: MUX的实例化语句包括: 的实例化语句包括 • 模块名称:与引用模块相同 模块名称: endmodule • 实例名称:任意,但要符合标记命名规则 实例名称:任意, • 端口列表:与引用模块的次序相同 端口列表:
3.$time与$realtime . 与
$time、$realtime是属于显示仿真时间标度的系统函数。 、 是属于显示仿真时间标度的系统函数。 是属于显示仿真时间标度的系统函数 这两个函数被调用时, 这两个函数被调用时,都返回当前时刻距离仿真开始时 刻的时间量值。 刻的时间量值。 $time 函数以 位整数值的形式返回模拟时间, 函数以64位整数值的形式返回模拟时间 位整数值的形式返回模拟时间, $realtime 函数则以实数型数据返回模拟时间。 函数则以实数型数据返回模拟时间。