zhh124的个人空间 https://blog.eetop.cn/zhh [收藏] [复制] [分享] [RSS]

空间首页 动态 记录 日志 相册 主题 分享 留言板 个人资料

日志

Verilog -- testbench 读书笔记

已有 6863 次阅读| 2010-3-24 15:00

//testbench的波形输出
module top;
...
initial
begin
    $dumpfile("./top.vcd");    //存储波形的文件名和路径,一般是.vcd格式.
    $dumpvars(1,top);          //存储top这一层的所有信号数据
    $dumpvars(2,top.u1);       //存储top.u1之下两层的所有数据信号(包含top.u1这一层)
    $dumpvars(3,top.u2);       //存储top.u2之下三层的所有数据信号(包含top.u2这一层)
    $dumpvars(0,top.u3);       //存储top.u3之下所有层的所有数据信号
end
endmodule

//产生随机数,seed是种子
$random(seed);
ex: din <= $random(20);

//仿真时间,为unsigned型的64位数据
$time
ex:
...
time    condition_happen_time;
...
condition_happen_time = $time;
...
$monitor($time,"data utput = %d", dout);
...

//参数
parameter   para1 = 10,
            para2 = 20,
            para3 = 30;

//显示任务
$display();
//监视任务
$monitor();

//延迟模型
specify
...
//describ pin-to-pin delay
endspecify

ex:
module nand_or(Y,A,B,C);
input A,B,C;
output Y;

    AND2 #0.2 (N,A,B);
    OR2  #0.1 (Y,C,N);

    specify
        (A*->Y) = 0.2;
        (B*->Y) = 0.3;
        (C*->Y) = 0.1;
    endspecify
endmodule

//时间刻度
`timescale  单位时间/时间精确度

//文件I/O
1.打开文件
integer file_id;
file_id = fopen("file_path/file_name");
2.写入文件
//$fmonitor只要有变化就一直记录
$fmonitor(file_id, "%format_char", parameter);
eg:$fmonitor(file_id, "%m: %t in1=%d o1=%h", $time, in1, o1);
//$fwrite需要触发条件才记录
$fwrite(file_id, "%format_char", parameter);
//$fdisplay需要触发条件才记录
$fdisplay(file_id, "%format_char", parameter);
$fstrobe();
3.读取文件
integer file_id;
file_id = $fread("file_path/file_name", "r");
4.关闭文件
$fclose(fjile_id);
5.由文件设定存储器初值
$readmemh("file_name", memory_name"); //初始化数据为十六进制
$readmemb("file_name", memory_name"); //初始化数据为二进制

//仿真控制
$finish(parameter); //parameter = 0,1,2
$stop(parameter);

//读入SDF文件
$sdf_annotate("sdf_file_name", module_instance, "scale_factors");
//module_instance: sdf文件所对应的instance名.
//scale_factors:针对timming delay中的最小延时min,典型延迟typ,最大延时max调整延迟参数

//generate语句,在Verilog-2001中定义.用于表达重复性动作
//必须事先声明genvar类型变量作为generate循环的指标
eg:
genvar i;
generate for(i = 0; i < 4; i = i + 1)
begin
    assign = din[i] = i % 2;
end
endgenerate

//资源共享
always @(A or B or C or D)
    sum = sel ? (A+B):(C+D);

//上面例子使用两个加法器和一个MUX,面积大

//下面例子使用一个加法器和两个MUX,面积小

always @(A or B or C or D)
begin
    tmp1 = sel ? A:C;
    tmp2 = sel ? B:D;
end

always @(tmp1 or tmp2)
    sum = tmp1 + tmp2;


点赞

全部作者的其他最新日志

发表评论 评论 (2 个评论)

回复 dylan_uestc 2010-3-29 19:39
好东西,这个要顶

facelist

您需要登录后才可以评论 登录 | 注册

  • 关注TA
  • 加好友
  • 联系TA
  • 0

    周排名
  • 0

    月排名
  • 0

    总排名
  • 0

    关注
  • 1

    粉丝
  • 4

    好友
  • 0

    获赞
  • 2

    评论
  • 684

    访问数
关闭

站长推荐 上一条 /1 下一条

小黑屋| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-5-14 19:44 , Processed in 0.024617 second(s), 14 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
返回顶部