在验证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从文件读入激励的更多相关文章

  1. VHDL TestBench基础(转)

    TestBench的主要目标是: 实例化DUT-Design Under Test 为DUT产生激励波形 产生参考输出,并将DUT的输出与参考输出进行比较 提供测试通过或失败的指示 TestBench ...

  2. curl 命令 从文件读取参数

    -d @filename 从文件读入内容-d @- 从stdin读入内容 -x localhost:8888   加上fiddler代理 一个sample curl -K api.conf -d @b ...

  3. Testbench学习笔记

    Testbench学习笔记(一) 书写testbench是数字电路设计中不可或缺的一项设计方法,主要是提供的是激励.尽管现在各种开发工具都通过绘制波形图的方法生成测试激励,测试书写的代码,但是其不可移 ...

  4. 基于UVM的verilog验证

    Abstract 本文介绍UVM框架,并以crc7为例进行UVM的验证,最后指出常见的UVM验证开发有哪些坑,以及怎么避免. Introduction 本例使用环境:ModelSim 10.2c,UV ...

  5. 基于UVM的verilog验证(转)

    reference:https://www.cnblogs.com/bettty/p/5285785.html Abstract 本文介绍UVM框架,并以crc7为例进行UVM的验证,最后指出常见的U ...

  6. Windows API 函数列表 附帮助手册

    所有Windows API函数列表,为了方便查询,也为了大家查找,所以整理一下贡献出来了. 帮助手册:700多个Windows API的函数手册 免费下载 API之网络函数 API之消息函数 API之 ...

  7. 我的SQL总结---未完待续

    我的SQL总结---未完待续 版权声明:本文为博主原创文章,未经博主允许不得转载. 总结: 主要的SQL 语句: 数据操作(select, insert, delete, update) 访问控制(g ...

  8. 使用Microsoft Roslyn提取C#和VB.NET源代码中的字符串常量

    Microsoft Roslyn是微软.NET“编译器即服务(Compiler as a Service)”的主要产品,它提供了开放的编译器API,并为源代码产生.分析和重构提供了新一代的语言对象模型 ...

  9. awk sed 总结

    Awk总结笔记 介绍 90年代 new awk :nawk Linux 的是gawk 我们简化awk 用法 #  awk [options ] ‘scripts’ file1 file2 .... # ...

随机推荐

  1. react 传递非state给子元素的注意事项

    我们是使用react的时候,其实很多情况都不需要使用state去存储值,如果不涉及页面渲染的值,我们往往可以使用 this.xxx的方式:这样可以提高组件的性能,避免不必要的 re_render 带来 ...

  2. HTTP 协议入门-笔记

    原文参考http://mp.weixin.qq.com/s/czx0AHaItrJ-c49XDboIUg  HTTP是基于TCP/IP协议的应用层协议,规定了客户端和服务端之间的通信格式,默认使用80 ...

  3. Java内部类的介绍

    在Java的面向对象编程中,由于Java并没有类似C++的多重继承,所以采用了内部类这样的方式,现在介绍几种内部类的常见情况. 公开内部类 即由public关键词修饰的内部类,内部类作为外部类的一个成 ...

  4. SurfaceView获取本地视频播放

    1.定义 可以直接从内存或者DMA等硬件接口取得图像数据,是个非常重要的绘图容器. 它的特性是:可以在主线程之外的线程中向屏幕绘图上.这样可以避免画图任务繁重的时候造成主线程阻塞,从而提高了程序的反应 ...

  5. java持有对象【1】容器类及ArrayList

    如果一个程序只包含固定数量的且其生命周期都是已知的对象,那么这是一个非常简单的程序.  ----------java编程思想第十一章引言 java有许多方式引用对象,例如学过的数组,他是编译器支持的类 ...

  6. DOS中的ECHO命令详解

    1. 作为控制批处理命令在执行时是否显示命令行自身的开关  格式:ECHO [ON|OFF]  如果想关闭“ECHO OFF”命令行自身的显示,则需要在该命令行前加上“@”.  2. 显示当前ECHO ...

  7. (个人记录)Python2 与Python3的版本区别

    现在还有些开源模块还没有更新到python3 ,不了解版本区别,无法对不合适的地方进行更改. 由于只追求向Python3靠近,所以对于python2的特别用法不探究. 此文不补全所有版本区别,仅作档案 ...

  8. Scala包的使用

    package big.data.analyse.scala.classes /** * Created by zhen on 2018/9/15. */ object Packages { def ...

  9. 适用于 Windows VM 的 Azure 示例基础结构演练

    本文是更广泛系列的一部分,当你在 Azure 中构建应用程序基础结构时,这些系列向你提供设计注意事项和准则. 用户可以查看系列中的其他主题. 尽管用户可以在 Azure 中快速地构建出开发/测试环境, ...

  10. 【Redis数据库】命令学习笔记——发布订阅、事务、脚本、连接等命令汇总

    本篇基于redis 4.0.11版本,学习发布订阅.事务.脚本.连接的相关命令. Redis 发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息. 序号 ...