|
楼主 |
发表于 2014-1-13 19:20:06
|
显示全部楼层
先尝试 《DE2上使用OC8051运行点灯程序》,因为下载的文件是完整的,设置一下仿真参数,综合一下就可以仿真了。
我使用的是Quartus 12 加 modesim 6.5 (和文章版本不一致,暂时不知道是否会影响结果)
结果如下图,
警告很多,但是已经有了眉目了。顺藤摸瓜。
(仿真即使有问题,即使不理解,这个仿真在心里上也是非常重要的。借用《科学结构的革命》中的范式概念,现在刚找到了一种8051软核范式,在该范式下仿真或测试都是有解的,只不过题目比较难,我只要需要耐心学习,然后解题就可以了。)
*******************************
先从oc8051_tb.v文件开始理解,
该文件是test bench文件,
网上搜一下,
什么是test bench 文件?
知道了什么是test bench后,再
如何编写testbench?
编写test bench格式:
1、Module 仿真模块名1;
2、各个施加激励的端口2;
3、例化设计模块3;
4、使用initial 或always 语句来产生激励波形4;
5、监控和比较输出响应5;
6、Endmodule
为什么要按照上面的格式?
*************************************************
那么看一下oc8051_tb.v 的格式和内容,
仿真模块名1, oc8051_tb;
各个施加激励的端口2,
parameter FREQ = 12000; // frequency in kHz
parameter DELAY = 500000/FREQ;
reg rst, clk,int0,int1, rxd;
reg [7:0] p0_in, p1_in, p2_in;
wire [31:0] idat_i;
wire [15:0] ext_addr, iadr_o;
wire write, write_xram, write_uart, int_uart, txd,t0, t1, bit_out, stb_o ;
wire ack_xram, ack_uart, cyc_o, istb_o, icyc_o, t2, t2ex;
wire [7:0] data_in, data_out, p0_out, p1_out, p2_out, p3_out, data_out_uart, data_out_xram;
reg [7:0] p3_in;
reg wbi_err_i, wbd_err_i;
reg iack_i,dack_i;
reg ea;
例化设计模块3,
oc8051_top oc8051_top_1(.wb_rst_i(rst), .wb_clk_i(clk),
.int0_i(int0), .int1_i(int1),
.wbd_err_i(wbd_err_i), .wbd_ack_i(dack_i),
.wbd_cyc_o(cyc_o),
.wbi_adr_o(iadr_o), .wbi_stb_o(istb_o), .wbi_ack_i(iack_i),
.wbi_cyc_o(icyc_o), .wbi_dat_i(idat_i), .wbi_err_i(wbi_err_i),
`ifdef OC8051_PORTS
`ifdef OC8051_PORT0
.p0_i(p0_in),
.p0_o(p0_out),
`endif
`ifdef OC8051_PORT1
.p1_i(p1_in),
.p1_o(p1_out),
`endif
`ifdef OC8051_PORT2
.p2_i(p2_in),
.p2_o(p2_out),
`endif
`ifdef OC8051_PORT3
.p3_i(p3_in),
.p3_o(p3_out),
`endif
`endif
`ifdef OC8051_UART
.rxd_i(rxd), .txd_o(txd),
`endif
`ifdef OC8051_TC01
.t0_i(t0), .t1_i(t1),
`endif
`ifdef OC8051_TC2
.t2_i(t2), .t2ex_i(t2ex),
`endif
.ea_in(ea));
使用initial 或always 语句来产生激励波形4,
initial begin
clk= 1'b0;
rst= 1'b1;
ea=1'b1;
wbd_err_i=1'b0;
dack_i=1'b0;
iack_i=1'b0;
wbi_err_i=8'h00;
#100
rst = 1'b0;
#1200
$finish;
end
always clk = #10 ~clk;
监控和比较输出响应5,
initial $dumpvars;
//initial $monitor("time ",$time," rst ",rst, " int1 ", int1, " int2 ", int2, " int3 ", int3, " sw1 ", sw1, " sw2 ", sw2, " sw3 ", sw3, " sw4 ", sw4, " int act ", int_act, " p0_out %h", p0_out);
//initial $monitor("time ",$time," rst ",rst, " p1_out %h", p1_out);
endmodule
*********************************************************************
引用《DE2上使用OC8051运行点灯程序》,上面的测试代码定义了时钟周期是20ns,注意的是要给ack_i、iack_i、wbd_err_i、wbi_err_i赋初值,否则会导致时序仿真出现异常。
tb文件的最大难点,我感觉和其它的模块文件一致,大量的输入输出名称,如果对8051结构(输入输出和各种模块,笔记02的内容)不熟悉,真得是不能承受之重。 |
|