在testbench从文件读入激励
在验证verilog逻辑模块功能时候,我们可以从文件中读入激励,便于大规模的验证。文件中的数据我们可以用c++编写程序产生。
第一种读入文件的方法是用系统函数:$readmemb, readmemh, 第一个函数是读入二进制的字符串,第二个是读入16进制的字符串。
我们准备两个文本文件x1.txt
1111
1010
1110
0001
y1.txt
1101
0101
1010
0001
我们验证一个四位的加法器
加法器verilog代码如下:
module adder4(cout, sum, ina, inb, cin,clk);
output [3:0] sum;
output cout;
input [3:0] ina, inb;
input cin,clk;
reg[3:0] tempa, tempb, sum;
reg cout;
reg tempc; always @(posedge clk)
begin
tempa = ina;
tempb = inb;
tempc = cin;
end always @(posedge clk)
begin
{cout, sum} = tempa+ tempb + tempc;
end
endmodule
testbench代码如下,我们用readmemb函数读入激励,并在for循环中赋值给ina,inb
`timescale 1ns/1ns
`include "adder4.v" module adder_rw_tb;
reg[3:0] ina,inb;
reg cin;
reg clk = 0;
wire[3:0] sum;
wire cout;
reg[3:0] inam[0:3];
reg[3:0] inbm[0:3];
integer i;
always #10 clk =~ clk; initial
begin
$readmemb("x1.txt",inam);
$readmemb("y1.txt",inbm);
for(i=0;i<4;i=i+1)
begin
#20 ina = inam[i];
inb = inbm[i];
end
end initial
begin
cin=0;
repeat(2)
#200 cin = {$random} % 16;
end adder4 adder4_0(
.clk(clk),
.sum(sum),
.cout(cout),
.ina(ina),
.inb(inb),
.cin(cin)
);
initial
begin
$monitor($time,,,"%b + %b + %b = {%b,%b}", ina, inb, cin,cout,sum);
#400 $finish;
end initial
begin
$dumpfile("dump.vcd");
$dumpvars;
end
endmodule
用vcs编译后,run simv
Contains Synopsys proprietary information.
Compiler version M-2017.03-SP2-11; Runtime version M-2017.03-SP2-11; Dec 21 19:34 2018
0 xxxx + xxxx + 0 = {x,xxxx}
20 1111 + 1101 + 0 = {x,xxxx}
30 1111 + 1101 + 0 = {1,1100}
40 1010 + 0101 + 0 = {1,1100}
50 1010 + 0101 + 0 = {0,1111}
60 1110 + 1010 + 0 = {0,1111}
70 1110 + 1010 + 0 = {1,1000}
80 0001 + 0001 + 0 = {1,1000}
90 0001 + 0001 + 0 = {0,0010}
$finish called from file "adder_rw_tb.v", line 44.
$finish at simulation time 400
V C S S i m u l a t i o n R e p o r t
在verdi中装入dump.vcd,波形如下:
修改testbench代码,用fdisplay把输出写到文件里面。
`timescale 1ns/1ns
`include "adder4.v" module adder_rw_tb;
reg[3:0] ina,inb;
reg cin;
reg clk = 0;
wire[3:0] sum;
wire cout;
reg[3:0] inam[0:3];
reg[3:0] inbm[0:3];
integer i;
integer fd;
always #10 clk =~ clk; initial
begin
$readmemb("x1.txt",inam);
$readmemb("y1.txt",inbm);
fd = $fopen("z1.txt");
for(i=1;i<4;i=i+1)
begin
#20 ina = inam[i];
inb = inbm[i];
$fdisplay(fd,"%b %b %b %b",ina, inb,sum,cout);
end
#20
$fdisplay(fd,"%b %b %b %b",ina, inb,sum,cout);
$fclose(fd);
end initial
begin
cin=0;
repeat(2)
#200 cin = {$random} % 16;
end adder4 adder4_0(
.clk(clk),
.sum(sum),
.cout(cout),
.ina(ina),
.inb(inb),
.cin(cin)
);
initial
begin
$monitor($time,,,"%b + %b + %b = {%b,%b}", ina, inb, cin,cout,sum);
#400 $finish;
end initial
begin
$dumpfile("dump.vcd");
$dumpvars;
end
endmodule
编译执行程序后,可以得到z1.txt
1111 1101 xxxx x
1010 0101 1100 1
1110 1010 1111 0
0001 0001 1000 1
0001 0001 0010 0
我们也可以把两个输入数据合在一个文件xy.txt里面,
1111 1101
1010 0101
1110 1010
0001 0001
用fscanf来读入激励数据,代码如下:
`timescale 1ns/1ns
`include "adder4.v" module adder_rw_tb;
reg[3:0] ina,inb;
reg cin;
reg clk = 0;
wire[3:0] sum;
wire cout;
reg[3:0] inam[0:3];
reg[3:0] inbm[0:3];
integer i;
integer fd,fd_r;
always #10 clk =~ clk; initial
begin
fd_r = $fopen("xy.txt","r");
fd = $fopen("z.txt","w");
for(i=0;i<4;i=i+1)
begin
#20
$fscanf(fd_r, "%d %d",ina,inb);
$fwrite(fd,"%b %b %b %b\n",ina, inb,sum,cout);
end
#20
$fwrite(fd,"%b %b %b %b\n",ina, inb,sum,cout);
$fclose(fd);
end initial
begin
cin=0;
repeat(2)
#200 cin = {$random} % 16;
end adder4 adder4_0(
.clk(clk),
.sum(sum),
.cout(cout),
.ina(ina),
.inb(inb),
.cin(cin)
);
initial
begin
$monitor($time,,,"%b + %b + %b = {%b,%b}", ina, inb, cin,cout,sum);
#400 $finish;
end initial
begin
$dumpfile("dump.vcd");
$dumpvars;
end
endmodule
Chronologic VCS simulator copyright 1991-2017
Contains Synopsys proprietary information.
Compiler version M-2017.03-SP2-11; Runtime version M-2017.03-SP2-11; Dec 21 20:13 2018
0 xxxx + xxxx + 0 = {x,xxxx}
20 0111 + 1101 + 0 = {x,xxxx}
30 0111 + 1101 + 0 = {1,0100}
40 0010 + 0101 + 0 = {1,0100}
50 0010 + 0101 + 0 = {0,0111}
60 0110 + 0010 + 0 = {0,0111}
70 0110 + 0010 + 0 = {0,1000}
80 0001 + 0001 + 0 = {0,1000}
90 0001 + 0001 + 0 = {0,0010}
写入z.txt数据为:
0111 1101 xxxx x
0010 0101 0100 1
0110 0010 0111 0
0001 0001 1000 0
0001 0001 0010 0
在testbench从文件读入激励的更多相关文章
- VHDL TestBench基础(转)
TestBench的主要目标是: 实例化DUT-Design Under Test 为DUT产生激励波形 产生参考输出,并将DUT的输出与参考输出进行比较 提供测试通过或失败的指示 TestBench ...
- curl 命令 从文件读取参数
-d @filename 从文件读入内容-d @- 从stdin读入内容 -x localhost:8888 加上fiddler代理 一个sample curl -K api.conf -d @b ...
- Testbench学习笔记
Testbench学习笔记(一) 书写testbench是数字电路设计中不可或缺的一项设计方法,主要是提供的是激励.尽管现在各种开发工具都通过绘制波形图的方法生成测试激励,测试书写的代码,但是其不可移 ...
- 基于UVM的verilog验证
Abstract 本文介绍UVM框架,并以crc7为例进行UVM的验证,最后指出常见的UVM验证开发有哪些坑,以及怎么避免. Introduction 本例使用环境:ModelSim 10.2c,UV ...
- 基于UVM的verilog验证(转)
reference:https://www.cnblogs.com/bettty/p/5285785.html Abstract 本文介绍UVM框架,并以crc7为例进行UVM的验证,最后指出常见的U ...
- Windows API 函数列表 附帮助手册
所有Windows API函数列表,为了方便查询,也为了大家查找,所以整理一下贡献出来了. 帮助手册:700多个Windows API的函数手册 免费下载 API之网络函数 API之消息函数 API之 ...
- 我的SQL总结---未完待续
我的SQL总结---未完待续 版权声明:本文为博主原创文章,未经博主允许不得转载. 总结: 主要的SQL 语句: 数据操作(select, insert, delete, update) 访问控制(g ...
- 使用Microsoft Roslyn提取C#和VB.NET源代码中的字符串常量
Microsoft Roslyn是微软.NET“编译器即服务(Compiler as a Service)”的主要产品,它提供了开放的编译器API,并为源代码产生.分析和重构提供了新一代的语言对象模型 ...
- awk sed 总结
Awk总结笔记 介绍 90年代 new awk :nawk Linux 的是gawk 我们简化awk 用法 # awk [options ] ‘scripts’ file1 file2 .... # ...
随机推荐
- JS性能优化 之 FOR循环
FOR 循环我们用的真的是太多了,但你是否关注过它的优化写法呢?记录下: 1. 最最常规写法,没有任何不妥 for (var i = 0; i < 10; i++) { // do someth ...
- iOS8自定义推送显示按钮及推送优化
http://www.jianshu.com/p/803bfaae989e iOS8自定义推送显示按钮及推送优化 字数1435 阅读473 评论0 喜欢2 导语 在iOS8中,推送消息不再只是简单地点 ...
- C语言目录
软件行业的很多细分学科都是都是基于C语言的,学习数据结构.算法.操作系统.编译原理等都离不开C语言. PHP.Python 等都是用C语言开发出来的,虽然平时做项目的时候看不到C语言的影子,但是如果想 ...
- JList动态添加元素
JList动态添加元素 http://www.cnblogs.com/tianguook/archive/2012/01/31/2333992.html https://zhuanlan.zhih ...
- 按ctrl+shift切换不了输入法
解决方法: 1.在任务栏上的输入法图标上点右键选择设置2.选择键设置,双击第一个“在不同的输入语言之间切换”先勾选“切换输入语言”下面选择左手ALT.取消右边“切换键盘布局”前的勾3.进入“中文(简体 ...
- 关于ORA-00257: archiver error. Connect internal only, until freed 错误处理方法
产生原因:出现ORA-00257错误(空间不足错误),通过查找资料,绝大部分说这是由于归档日志太多,占用了全部的硬盘剩余空间导致的,通过简单删除日志或加大存储空间就能够解决 解决办法:(亲测有效) 1 ...
- 用JS制作《飞机大作战》游戏_第1讲(素材查找和界面框架搭建)-陈远波
一.查找素材: 二.分析游戏界面框架: 登录界面.游戏界面.暂停游戏界面.玩家死亡后弹出界面:并对应的界面包含什么元素: 三.分别搭建以上四个界面: 1.登录界面与游戏界面框架(隐藏游戏界面,四个界面 ...
- sql注入--access
access数据库结构: 表名 --> 列名 --> 数据 access注入攻击片段 联合查询法: (1) 判断注入点: ?id=1 and 1=1 ; ?id=1 and 1 ...
- sdn2017 第三次作业
1.阅读: 阅读<图解openflow>第一二章(请自己查找相应书籍) 阅读文章:http://www.sdnlab.com/19777.html 阅读<重构网络>第一二章 2 ...
- Python接口自动化--requests 2
# _*_ encoding:utf-8 _*_ import json import requests #post请求 payload = {"cindy":"hell ...