不同抽象级别的Verilog HDL模型 | 您所在的位置:网站首页 › verilog与非门描述 › 不同抽象级别的Verilog HDL模型 |
表示在模块中引用了一个名为nd1的与非门(nand),输入为data、clock和clear,输出为a,输出与输入的延时为10个单位时间。
1.如何用Verilog HDL语言描述D型主从触发器模块?
门级结构描述D触发器
![]() 由已经设计成的模块来构成更高一层的模块 引用上面的模块flop,构成一个四位寄存器,代码如下: //hardreg.v //` include " flop.v" module hardreg(d,clk,clrb,q); input clk,clrb; input[3:0] d; output[3:0] q; flop f1(d[0],clk,clrb,q[0],), // 注意结束时用逗号,最后才用分号 f2(d[1],clk,clrb,q[1],), // 表示f1 到f4 都是flop f3(d[2],clk,clrb,q[2],), f4(d[3],clk,clrb,q[3],); endmodule既然四位寄存器的verilog已经出炉了,我最关心的部分已经来了。 3.如何对于上面的四位寄存器进行验证?testbench代码如下。 //hardreg_top.v //`include "flop.v" //`include " hardreg.v" //仿真时需要包含文件"hardreg.v" 和 "flop.v" /***如果仿真环境可以把有关的文件安排在一个项目中,只要底层模块经过编译,并记录在编译的库中,可以不用包含文件。**/ module hardreg_top; //顶层模块,没有输入和输出的端口 reg clock, clearb; //为产生测试用的时钟和清零信号需要寄存器 reg [3:0] data; //为产生测试用数据需要用寄存器 wire [3:0] qout; //为观察输出信号需要从模块实例端口中引出线 `define stim #100 data=4'b //宏定义 stim,可使源程序简洁 event end_first_pass; //定义事件end_first_pass hardreg reg_4bit (.d(data), .clk(clock), .clrb(clearb), .q(qout)); /************************************************************************ 把本模块中产生的测试信号data、clock、clearb输入实例reg_4bit以观察输出信号qout。 实例reg_4bit实际上是已经设计好的模块hardreg。 实例引用的hardreg模块,根据包含文件的不同, 可以是表示行为的模块也可以是表示结构的模块。 ***********************************************************************/ initial begin clock = 0; clearb = 1; end always #50 clock = ~clock; always @(end_first_pass) clearb = ~clearb; always @(posedge clock) $display("at time %0d clearb= %b data= %d qout= %d", $time, clearb, data, qout); /***************************************************** 类似于C语言的 printf 语句,可打印不同时刻的信号值 ******************************************************/ initial begin repeat(4) //重复四次产生下面的data变化 begin data=4'b0000; `stim 0001; /*************************************************************** 宏定义stim引用,等同于 #100 data=4'b0001;。注意引用时要用 `符号。 ******************************************************/ `stim 0010; `stim 0011; `stim 0100; `stim 0101; `stim 0110; `stim 0111; `stim 1000; `stim 1001; `stim 1010; `stim 1011; `stim 1100; `stim 1101; `stim 1110; `stim 1111; #200 -> end_first_pass; end /*********************************************** 延迟200个单位时间,触发事件end_first_pass ************************************************/ $finish; //结束仿真 end endmodule 4.既然有了所有的代码,就进入linux开始VCS编译仿真 编译![]() ![]() 运行上面的命令,产生的效果如下(是不是多了两个文件): 运行./simv -gui打开DVE图形化界面 好吧,我暂且认为是自己的testbench中没有加$vcdpluson()造成的。 5.重新盘一下第四步为什么没有波形文件1、编译 要想有波形文件,必须在testbench中加入$vcdpluson类似的的语句,最简单的格式如下: initial begin $vcdpluson; end编译的时候,必须加上“+vcd+vcdpluson”开关,在仿真时才能产生波形文件,使用如下命令编译: vcs *.v -l readme.log +v2k -debug_all +vcd+vcdplusonvcs *.v 就是编译的主要命令 -l readme.log 就是把编译过程记录在文件readme.log中,以备后面查看 +v2k 好像是遵守verilog 2005 标准编译吧 -debug_all 就是打开所有的debug开关,还有-debug_pp、-debug +vcd+vcdpluson 在仿真时才能产生波形文件 2.仿真 命令如下: ./simv -l run.log./simv 就可以生成波形文件vcdpluson.vpd -l run.log 把仿真的过程记录在文件run.log中,以备后面查看 3.看波形 dve –vpd vcdpluson.vpd结果又报错了,尽管打开了dve,但是打不开波形文件 ![]() 修改文件名,继续!结果不知道为什么是这样!就这样吧 我现在真的不知道该怎么学习验证了。昨天问学长,他怎么学的verilog,他说就简单看了一下verilog语法,也没练习。我该怎么做呀!有点难搞,炸裂,裂开。 |
CopyRight 2018-2019 实验室设备网 版权所有 |