OpenCores
URL https://opencores.org/ocsvn/or1200_hp/or1200_hp/trunk

Subversion Repositories or1200_hp

[/] [or1200_hp/] [trunk/] [bench/] [rtl_cm4/] [verilog/] [or1200_tb_cm4.v] - Rev 2

Compare with Previous | Blame | View Log

///////////////////////////////////////////////
//	OR1200 Testbench Top Level for
//	Random Instruction Code Generator
//	and Hyper Pipelined OR1200 Core with
//	CMF = 4
///////////////////////////////////////////////
 
// synopsys translate_off
`include "timescale.v"
// synopsys translate_on
`include "or1200_defines.v"
 
module or1200_testbench_cm4();
 
 
parameter dw = `OR1200_OPERAND_WIDTH;
parameter aw = `OR1200_OPERAND_WIDTH;
parameter ppic_ints = `OR1200_PIC_INTS;
 
//
// I/O
//
 
//
// System
//
//reg			clk_i;
//reg			rst_i;
reg	[1:0]		clmode_i;	// 00 WB=RISC, 01 WB=RISC/2, 10 N/A, 11 WB=RISC/4
reg	[ppic_ints-1:0]	pic_ints_i;
 
//
// Instruction WISHBONE interface
//
//reg			iwb_clk_i;	// clock input
//reg			iwb_rst_i;	// reset input
wire			iwb_ack_i;	// normal termination
reg			iwb_err_i;	// termination w/ error
reg			iwb_rty_i;	// termination w/ retry
wire	[dw-1:0]	iwb_dat_i;	// input data bus
wire			iwb_cyc_o;	// cycle valid output
wire	[aw-1:0]	iwb_adr_o;	// address bus outputs
wire			iwb_stb_o;	// strobe output
wire			iwb_we_o;	// indicates write transfer
wire	[3:0]		iwb_sel_o;	// byte select outputs
wire	[dw-1:0]	iwb_dat_o;	// output data bus
`ifdef OR1200_WB_CAB
wire			iwb_cab_o;	// indicates consecutive address burst
`endif
`ifdef OR1200_WB_B3
wire	[2:0]		iwb_cti_o;	// cycle type identifier
wire	[1:0]		iwb_bte_o;	// burst type extension
`endif
 
//
// Data WISHBONE interface
//
//reg			dwb_clk_i;	// clock input
//reg			dwb_rst_i;	// reset input
reg			dwb_ack_i;	// normal termination
reg			dwb_err_i;	// termination w/ error
reg			dwb_rty_i;	// termination w/ retry
reg	[dw-1:0]	dwb_dat_i;	// input data bus
wire			dwb_cyc_o;	// cycle valid output
wire	[aw-1:0]	dwb_adr_o;	// address bus outputs
wire			dwb_stb_o;	// strobe output
wire			dwb_we_o;	// indicates write transfer
wire	[3:0]		dwb_sel_o;	// byte select outputs
wire	[dw-1:0]	dwb_dat_o;	// output data bus
`ifdef OR1200_WB_CAB
wire			dwb_cab_o;	// indicates consecutive address burst
`endif
`ifdef OR1200_WB_B3
wire	[2:0]		dwb_cti_o;	// cycle type identifier
wire	[1:0]		dwb_bte_o;	// burst type extension
`endif
 
//
// External Debug Interface
//
reg			dbg_stall_i;	// External Stall Input
reg			dbg_ewt_i;	// External Watchpoint Trigger Input
wire	[3:0]		dbg_lss_o;	// External Load/Store Unit Status
wire	[1:0]		dbg_is_o;	// External Insn Fetch Status
wire	[10:0]		dbg_wp_o;	// Watchpoints Outputs
wire			dbg_bp_o;	// Breakpoint Output
reg			dbg_stb_i;      // External Address/Data Strobe
reg			dbg_we_i;       // External Write Enable
reg	[aw-1:0]	dbg_adr_i;	// External Address Input
reg	[dw-1:0]	dbg_dat_i;	// External Data Input
wire	[dw-1:0]	dbg_dat_o;	// External Data Output
wire			dbg_ack_o;	// External Data Acknowledge (not WB compatible)
 
`ifdef OR1200_BIST
//
// RAM BIST
//
reg mbist_si_i;
reg [`OR1200_MBIST_CTRL_WIDTH - 1:0] mbist_ctrl_i;
wire mbist_so_o;
`endif
 
//
// Power Management
//
reg			pm_cpustall_i;
wire	[3:0]		pm_clksd_o;
wire			pm_dc_gate_o;
wire			pm_ic_gate_o;
wire			pm_dmmu_gate_o;
wire			pm_immu_gate_o;
wire			pm_tt_gate_o;
wire			pm_cpu_gate_o;
wire			pm_wakeup_o;
wire			pm_lvolt_o;
 
 
/////////////////////////////////////////////////
//	Top Level Clocks, Reset and
//	Core Multiplier Level Selector
/////////////////////////////////////////////////
 
reg system_clk;
reg clk_i;
reg clk_i_cml_1;
reg clk_i_cml_2;
reg clk_i_cml_3;
reg [1:0] cmls;
reg rst;
integer cnt = 0;
reg [3:0] core_off;
parameter turnOffTime_2nd = 8502;
parameter turnOffTime_3nd = 15388;
parameter turnOnTime_3nd = 25226;
parameter turnOnTime_2nd = 34551;
 
/////////////////////////////////////////////////
//	Initial
/////////////////////////////////////////////////
 
initial begin
	system_clk <= 0;
	clk_i <= 0;
	clk_i_cml_1 <= 0;
	clk_i_cml_2 <= 0;
	clk_i_cml_3 <= 0;
	cmls <= 0;
	rst <= 1;
	core_off <= 0;
 
	clmode_i <= 0;	// 00 WB=RISC, 01 WB=RISC/2, 10 N/A, 11 WB=RISC/4
	pic_ints_i = 0;
	iwb_err_i = 0;	// termination w/ error
	iwb_rty_i = 0;	// termination w/ retry
	dwb_ack_i = 0;	// normal termination
	dwb_err_i = 0;	// termination w/ error
	dwb_rty_i = 0;	// termination w/ retry
	dwb_dat_i = 0;	// input data bus
	dbg_stall_i = 0;	// External Stall Input
	dbg_ewt_i = 0;	// External Watchpoint Trigger Input
	dbg_stb_i = 0;      // External Address/Data Strobe
	dbg_we_i = 0;       // External Write Enable
	dbg_adr_i = 0;	// External Address Input
	dbg_dat_i = 0;	// External Data Input
	pm_cpustall_i = 0;
end
 
/////////////////////////////////////////////////
//	Clock Generator
/////////////////////////////////////////////////
always begin
	#(50) 
	system_clk <= ~system_clk;
 
	// do not clock       when (core_off[1] and cmls == 0) or (core_off[2] and cmls == 1);
	clk_i       <= ~system_clk & (~(core_off[1] & (cmls == 0))) & (~(core_off[2] & (cmls == 1)));  
 
   	// do not clock cml_1 when (core_off[1] and cmls == 1) or (core_off[2] and cmls == 2);
	clk_i_cml_1 <= ~system_clk & (~(core_off[1] & (cmls == 1))) & (~(core_off[2] & (cmls == 2)));  
 
   	// do not clock cml_2 when (core_off[1] and cmls == 2) or (core_off[2] and cmls == 0);
	clk_i_cml_2 <= ~system_clk & (~(core_off[1] & (cmls == 2))) & (~(core_off[2] & (cmls == 3)));  
 
   	// do not clock cml_3 when (core_off[1] and cmls == 3) or (core_off[2] and cmls == 0);
	clk_i_cml_3 <= ~system_clk & (~(core_off[1] & (cmls == 3))) & (~(core_off[2] & (cmls == 0)));  
end
 
/////////////////////////////////////////////////
//	Core Multiplier Level Selector
/////////////////////////////////////////////////
 
always @(posedge system_clk)
	if (cmls == 3)
		cmls <= 0;
	else
		cmls <= cmls + 1;
 
 
/////////////////////////////////////////////////
//	Reset Generator
/////////////////////////////////////////////////
 
initial begin
	repeat (20) @(negedge system_clk);
	rst <= 0;
	repeat (turnOnTime_3nd - 19) @(negedge system_clk);
	rst <= 1;
	#20; //@(negedge system_clk);
	rst <= 0;
	repeat (turnOnTime_2nd - (turnOnTime_3nd - 19) - 17) @(negedge system_clk);
	rst <= 1;
	#20; 
	rst <= 0;
end
 
/////////////////////////////////////////////////
//	Process turns off/on second core
/////////////////////////////////////////////////
 
always @ (posedge system_clk) begin
	if (cnt == turnOffTime_2nd) begin
		core_off[1] <= 1'b1;
	end
	if (cnt == turnOffTime_3nd) begin
		core_off[2] <= 1'b1;
	end
	if (cnt == turnOnTime_2nd - 1) begin
		core_off[1] <= 1'b0;
	end
	if (cnt == turnOnTime_3nd - 1) begin
		core_off[2] <= 1'b0;
	end
end
 
/////////////////////////////////////////////////
//	Count and Stop after 20000 Cycles
/////////////////////////////////////////////////
 
always @ (posedge system_clk) 
begin
	cnt <= cnt + 1;
	if (cnt == 47000) begin
		$stop;
	end
end
 
 
/////////////////////////////////////////////////
//	Random Instruction Code Generator for 
//	3 Hyper Pipelined OR1200
/////////////////////////////////////////////////
 
random_rom_wb_cm4 random_rom_wb_cm4_i 
	( 
	.dat_o(iwb_dat_i),
	.adr_i(iwb_adr_o[25:2]), 
	.sel_i(iwb_sel_o), 
	.cyc_i(iwb_cyc_o), 
	.stb_i(iwb_stb_o), 
	.ack_o(iwb_ack_i), 
	.clk_i(system_clk),
	.cmls(cmls),
	.rst_i(rst),
	.core_off(core_off) );
 
/////////////////////////////////////////////////
//	Instantiation of Hyper Pipelined OR1200
//	with CMF = 3
/////////////////////////////////////////////////
 
or1200_top_cm4 or1200_top_cm4_i
     (
	.clk_i_cml_3(clk_i_cml_3),
	.clk_i_cml_2(clk_i_cml_2),
	.clk_i_cml_1(clk_i_cml_1),
	.cmls(cmls),
	// System
	.clk_i(clk_i), 
	.rst_i(rst), 
	.pic_ints_i(pic_ints_i), 
	.clmode_i(clmode_i),
 
	// Instruction WISHBONE INTERFACE
	//.iwb_clk_i(clk), 
	//.iwb_rst_i(rst), 
	.iwb_ack_i(iwb_ack_i), 
	.iwb_err_i(iwb_err_i), 
	.iwb_rty_i(iwb_rty_i), 
	.iwb_dat_i(iwb_dat_i),
	.iwb_cyc_o(iwb_cyc_o), 
	.iwb_adr_o(iwb_adr_o), 
	.iwb_stb_o(iwb_stb_o), 
	.iwb_we_o(iwb_we_o), 
	.iwb_sel_o(iwb_sel_o), 
	.iwb_dat_o(iwb_dat_o),
`ifdef OR1200_WB_CAB
	.iwb_cab_o(iwb_cab_o),
`endif
`ifdef OR1200_WB_B3
	.iwb_cti_o(iwb_cti_o), 
	.iwb_bte_o(iwb_bte_o),
`endif
	// Data WISHBONE INTERFACE
	//.dwb_clk_i(clk), 
	//.dwb_rst_i(rst), 
	.dwb_ack_i(dwb_ack_i), 
	.dwb_err_i(dwb_err_i), 
	.dwb_rty_i(dwb_rty_i), 
	.dwb_dat_i(dwb_dat_i),
	.dwb_cyc_o(dwb_cyc_o), 
	.dwb_adr_o(dwb_adr_o), 
	.dwb_stb_o(dwb_stb_o), 
	.dwb_we_o(dwb_we_o), 
	.dwb_sel_o(dwb_sel_o), 
	.dwb_dat_o(dwb_dat_o),
`ifdef OR1200_WB_CAB
	.dwb_cab_o(dwb_cab_o),
`endif
`ifdef OR1200_WB_B3
	.dwb_cti_o(dwb_cti_o), 
	.dwb_bte_o(dwb_bte_o),
`endif
 
	// External Debug Interface
	.dbg_stall_i(dbg_stall_i), 
	.dbg_ewt_i(dbg_ewt_i),	
	.dbg_lss_o(dbg_lss_o), 
	.dbg_is_o(dbg_is_o), 
	.dbg_wp_o(dbg_wp_o), 
	.dbg_bp_o(dbg_bp_o),
	.dbg_stb_i(dbg_stb_i), 
	.dbg_we_i(dbg_we_i), 
	.dbg_adr_i(dbg_adr_i), 
	.dbg_dat_i(dbg_dat_i), 
	.dbg_dat_o(dbg_dat_o), 
	.dbg_ack_o(dbg_ack_o),
 
`ifdef OR1200_BIST
	// RAM BIST
	.mbist_si_i(mbist_si_i), 
	.mbist_so_o(mbist_so_o), 
	.mbist_ctrl_i(mbist_ctrl_i),
`endif
	// Power Management
	.pm_cpustall_i(pm_cpustall_i),
	.pm_clksd_o(pm_clksd_o), 
	.pm_dc_gate_o(pm_dc_gate_o), 
	.pm_ic_gate_o(pm_ic_gate_o), 
	.pm_dmmu_gate_o(pm_dmmu_gate_o), 
	.pm_immu_gate_o(pm_immu_gate_o), 
	.pm_tt_gate_o(pm_tt_gate_o), 
	.pm_cpu_gate_o(pm_cpu_gate_o), 
	.pm_wakeup_o(pm_wakeup_o), 
	.pm_lvolt_o(pm_lvolt_o)
);
 
 
 
endmodule
 

Compare with Previous | Blame | View Log

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.