initial commit
This commit is contained in:
230
sim/mycpu_tb.v
Normal file
230
sim/mycpu_tb.v
Normal file
@@ -0,0 +1,230 @@
|
||||
/*------------------------------------------------------------------------------
|
||||
--------------------------------------------------------------------------------
|
||||
Copyright (c) 2016, Loongson Technology Corporation Limited.
|
||||
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without modification,
|
||||
are permitted provided that the following conditions are met:
|
||||
|
||||
1. Redistributions of source code must retain the above copyright notice, this
|
||||
list of conditions and the following disclaimer.
|
||||
|
||||
2. Redistributions in binary form must reproduce the above copyright notice,
|
||||
this list of conditions and the following disclaimer in the documentation and/or
|
||||
other materials provided with the distribution.
|
||||
|
||||
3. Neither the name of Loongson Technology Corporation Limited nor the names of
|
||||
its contributors may be used to endorse or promote products derived from this
|
||||
software without specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
DISCLAIMED. IN NO EVENT SHALL LOONGSON TECHNOLOGY CORPORATION LIMITED BE LIABLE
|
||||
TO ANY PARTY FOR DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
|
||||
GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
|
||||
THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
--------------------------------------------------------------------------------
|
||||
------------------------------------------------------------------------------*/
|
||||
`timescale 1ns / 1ps
|
||||
`include "config.h"
|
||||
// `define FFT_OUTPUT_TXT
|
||||
|
||||
`define UART_PSEL u_soc_top.u_axi_uart_controller.uart0.PSEL
|
||||
`define UART_PENBLE u_soc_top.u_axi_uart_controller.uart0.PENABLE
|
||||
`define UART_PWRITE u_soc_top.u_axi_uart_controller.uart0.PWRITE
|
||||
`define UART_WADDR u_soc_top.u_axi_uart_controller.uart0.PADDR[7:0]
|
||||
`define UART_WDATA u_soc_top.u_axi_uart_controller.uart0.PWDATA[7:0]
|
||||
`define END_PC 32'h1c000200
|
||||
|
||||
module tb_top( );
|
||||
reg reset;
|
||||
reg clk;
|
||||
reg [3:0] touch_btn;
|
||||
reg [31:0] dip_sw;
|
||||
|
||||
wire UART_RX;
|
||||
wire UART_TX;
|
||||
wire [2:0] video_red;
|
||||
wire [2:0] video_green;
|
||||
wire [1:0] video_blue;
|
||||
wire video_hsync;
|
||||
wire video_vsync;
|
||||
wire video_clk;
|
||||
wire video_de;
|
||||
wire [15:0] leds;
|
||||
wire [7:0] dpy0;
|
||||
wire [7:0] dpy1;
|
||||
wire [19:0] base_ram_addr;
|
||||
wire [ 3:0] base_ram_be_n;
|
||||
wire base_ram_ce_n;
|
||||
wire base_ram_oe_n;
|
||||
wire base_ram_we_n;
|
||||
wire [19:0] ext_ram_addr;
|
||||
wire [ 3:0] ext_ram_be_n;
|
||||
wire ext_ram_ce_n;
|
||||
wire ext_ram_oe_n;
|
||||
wire ext_ram_we_n;
|
||||
wire [31:0] base_ram_data;
|
||||
wire [31:0] ext_ram_data;
|
||||
|
||||
//产生时钟与复位信号
|
||||
initial begin
|
||||
clk = 1'b0;
|
||||
reset = 1'b1;
|
||||
dip_sw = 32'h0;
|
||||
#2000;
|
||||
reset = 1'b0;
|
||||
end
|
||||
always #10 clk=~clk;
|
||||
|
||||
//产生按键信号
|
||||
initial begin
|
||||
touch_btn = 4'h0;
|
||||
dip_sw = 32'h0000_abcd;
|
||||
|
||||
#3000000;
|
||||
|
||||
#100000
|
||||
touch_btn = 4'b0001;
|
||||
#50
|
||||
touch_btn = 4'b0000;
|
||||
|
||||
#100000
|
||||
touch_btn = 4'b0010;
|
||||
#50
|
||||
touch_btn = 4'b0000;
|
||||
|
||||
#100000
|
||||
touch_btn = 4'b0100;
|
||||
#50
|
||||
touch_btn = 4'b0000;
|
||||
|
||||
#100000
|
||||
touch_btn = 4'b1000;
|
||||
#50
|
||||
touch_btn = 4'b0000;
|
||||
|
||||
end
|
||||
|
||||
soc_top #(.SIMULATION(1'b1)) u_soc_top (
|
||||
.clk ( clk ),
|
||||
.reset ( reset ),
|
||||
.touch_btn ( touch_btn ),
|
||||
.dip_sw ( dip_sw ),
|
||||
|
||||
.video_red ( video_red ),
|
||||
.video_green ( video_green ),
|
||||
.video_blue ( video_blue ),
|
||||
.video_hsync ( video_hsync ),
|
||||
.video_vsync ( video_vsync ),
|
||||
.video_clk ( video_clk ),
|
||||
.video_de ( video_de ),
|
||||
.leds ( leds ),
|
||||
.dpy0 ( dpy0 ),
|
||||
.dpy1 ( dpy1 ),
|
||||
|
||||
.base_ram_addr ( base_ram_addr ),
|
||||
.base_ram_be_n ( base_ram_be_n ),
|
||||
.base_ram_ce_n ( base_ram_ce_n ),
|
||||
.base_ram_oe_n ( base_ram_oe_n ),
|
||||
.base_ram_we_n ( base_ram_we_n ),
|
||||
.ext_ram_addr ( ext_ram_addr ),
|
||||
.ext_ram_be_n ( ext_ram_be_n ),
|
||||
.ext_ram_ce_n ( ext_ram_ce_n ),
|
||||
.ext_ram_oe_n ( ext_ram_oe_n ),
|
||||
.ext_ram_we_n ( ext_ram_we_n ),
|
||||
|
||||
.base_ram_data ( base_ram_data ),
|
||||
.ext_ram_data ( ext_ram_data ),
|
||||
|
||||
.UART_RX ( UART_RX ),
|
||||
.UART_TX ( UART_TX )
|
||||
);
|
||||
|
||||
sram_sp #(
|
||||
.AW ( 18 ),
|
||||
.Init_File(`SRAM_Init_File))
|
||||
base_sram_sp (
|
||||
.ram_addr ( base_ram_addr ),
|
||||
.ram_be_n ( base_ram_be_n ),
|
||||
.ram_ce_n ( base_ram_ce_n ),
|
||||
.ram_oe_n ( base_ram_oe_n ),
|
||||
.ram_we_n ( base_ram_we_n ),
|
||||
|
||||
.ram_data ( base_ram_data )
|
||||
);
|
||||
|
||||
sram_sp #(
|
||||
.AW ( 18 ),
|
||||
.Init_File(`SRAM_Init_File))
|
||||
ext_sram_sp (
|
||||
.ram_addr ( ext_ram_addr ),
|
||||
.ram_be_n ( ext_ram_be_n ),
|
||||
.ram_ce_n ( ext_ram_ce_n ),
|
||||
.ram_oe_n ( ext_ram_oe_n ),
|
||||
.ram_we_n ( ext_ram_we_n ),
|
||||
|
||||
.ram_data ( ext_ram_data )
|
||||
);
|
||||
|
||||
//模拟串口打印
|
||||
wire uart_display;
|
||||
wire [7:0] uart_data;
|
||||
wire uart_wen;
|
||||
assign uart_wen = (`UART_PSEL == 1'b1) && (`UART_PENBLE == 1'b1) && (`UART_PWRITE == 1'b1);
|
||||
assign uart_display = (uart_wen == 1'b1) && (`UART_WADDR == 8'h0);
|
||||
assign uart_data = `UART_WDATA;
|
||||
|
||||
always @(posedge clk)
|
||||
begin
|
||||
if(uart_display)
|
||||
begin
|
||||
if(uart_data==8'hff)
|
||||
begin
|
||||
;//$finish;
|
||||
end
|
||||
else
|
||||
begin
|
||||
$write("%c",uart_data);
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
//仿真结束
|
||||
wire [31:0] debug_wb_pc;
|
||||
assign debug_wb_pc = u_soc_top.debug_wb_pc;
|
||||
wire test_end = debug_wb_pc==`END_PC;
|
||||
always @(posedge u_soc_top.cpu_clk)
|
||||
begin
|
||||
if (!u_soc_top.cpu_resetn) begin
|
||||
end
|
||||
else if(test_end) begin
|
||||
$display("==============================================================");
|
||||
$display("Test end!");
|
||||
$finish;
|
||||
end
|
||||
end
|
||||
|
||||
//FFT测试结果输出
|
||||
`ifdef FFT_OUTPUT_TXT
|
||||
integer fft_output_re;
|
||||
integer fft_output_im;
|
||||
initial begin
|
||||
fft_output_re = $fopen("../../../../../../python/fft512_output_re.txt", "w");
|
||||
fft_output_im = $fopen("../../../../../../python/fft512_output_im.txt", "w");
|
||||
forever begin
|
||||
@(posedge u_soc_top.u_axi_fft_top.u_axi_fft_wrap.aclk);
|
||||
if(u_soc_top.u_axi_fft_top.u_axi_fft_wrap.valid_out) begin
|
||||
$fwrite(fft_output_re, "%04h\n", u_soc_top.u_axi_fft_top.u_axi_fft_wrap.y_re);
|
||||
$fwrite(fft_output_im, "%04h\n", u_soc_top.u_axi_fft_top.u_axi_fft_wrap.y_im);
|
||||
end
|
||||
end
|
||||
end
|
||||
`endif
|
||||
|
||||
endmodule
|
||||
52
sim/sram.v
Normal file
52
sim/sram.v
Normal file
@@ -0,0 +1,52 @@
|
||||
`timescale 1ns/100ps
|
||||
module sram_sp #(
|
||||
parameter AW = 16,
|
||||
parameter Init_File = "none"
|
||||
)
|
||||
(
|
||||
inout [31:0] ram_data, //BaseRAM数据,低8位与CPLD串口控制器共享
|
||||
input [19:0] ram_addr, //BaseRAM地址
|
||||
input [ 3:0] ram_be_n, //BaseRAM字节使能,低有效。如果不使用字节使能,请保持为0
|
||||
input ram_ce_n, //BaseRAM片选,低有效
|
||||
input ram_oe_n, //BaseRAM读使能,低有效
|
||||
input ram_we_n //BaseRAM写使能,低有效
|
||||
|
||||
);
|
||||
localparam AWT = ((1<<(AW-0))-1);
|
||||
|
||||
reg [31:0] BRAM [AWT:0];
|
||||
|
||||
initial begin
|
||||
if(Init_File != "none") begin
|
||||
$readmemb(Init_File,BRAM);
|
||||
end
|
||||
end
|
||||
|
||||
reg [AW-1:0] addr_q1;
|
||||
wire [3:0] write_enable;
|
||||
|
||||
assign write_enable[3:0] = (~ram_be_n) & {4{(~ram_ce_n) & (~ram_we_n)}};
|
||||
|
||||
|
||||
always@(posedge write_enable[0]) begin
|
||||
#10;
|
||||
if(~ram_be_n[0]) BRAM[ram_addr][7:0] <= ram_data[7:0];
|
||||
end
|
||||
always@(posedge write_enable[1]) begin
|
||||
#10;
|
||||
if(~ram_be_n[1]) BRAM[ram_addr][15:8] <= ram_data[15:8];
|
||||
end
|
||||
always@(posedge write_enable[2]) begin
|
||||
#10;
|
||||
if(~ram_be_n[2]) BRAM[ram_addr][23:16] <= ram_data[23:16];
|
||||
end
|
||||
always@(posedge write_enable[3]) begin
|
||||
#10;
|
||||
if(~ram_be_n[3]) BRAM[ram_addr][31:24] <= ram_data[31:24];
|
||||
end
|
||||
|
||||
wire [31:0] RDATA = BRAM[ram_addr];
|
||||
|
||||
assign ram_data = ((~ram_ce_n) & (~ram_oe_n)) ? RDATA : 32'hzzzzzzzz;
|
||||
|
||||
endmodule
|
||||
Reference in New Issue
Block a user