aboutsummaryrefslogtreecommitdiff
path: root/src/tb/tb_wrapper.v
blob: fae0934cde9a24e1dc45543e595f323a242e093c (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
`timescale 1ns / 1ps

module tb_wrapper;

		/*
		 * Settings
		 */
	localparam	USE_OPERAND_ADDR_WIDTH		= 7;
	localparam	USE_SYSTOLIC_ARRAY_POWER	= 1;

		/*
		 * Clock (100 MHz)
		 */
	reg clk;
	initial clk = 1'b0;
	always #5 clk = ~clk;
	
		/*
		 * Reset
		 */
	reg rst_n;
		 
		 /*
		  * Access Bus
		  */
	reg											bus_cs;
	reg											bus_we;
	reg	[USE_OPERAND_ADDR_WIDTH+2:0]	bus_addr;
	reg	[                    32-1:0]	bus_wr_data;
	wire	[                    32-1:0]	bus_rd_data;

	modexpa7_wrapper #
	(
		.OPERAND_ADDR_WIDTH		(USE_OPERAND_ADDR_WIDTH),
		.SYSTOLIC_ARRAY_POWER	(USE_SYSTOLIC_ARRAY_POWER)
	)
	uut
	(
		.clk			(clk),
		
		.rst_n		(rst_n),
		
		.cs			(bus_cs), 
		.we			(bus_we), 
		.address		(bus_addr), 
		.write_data	(bus_wr_data), 
		.read_data	(bus_rd_data)
	);

	reg	[31: 0]	tmp;
	initial begin
		//
		rst_n = 0;
		//
		bus_cs		= 0;
		bus_we		= 0;
		bus_addr		= 'bX;
		bus_wr_data	= 'bX;
		//
		#200;
		//
		rst_n = 1;
		//
		read_reg('h00, tmp);			// NAME0
		read_reg('h01, tmp);			// NAME1
		read_reg('h02, tmp);			// VERSION
		//
		read_reg('h13, tmp);			// BUFFER_BITS
		read_reg('h14, tmp);			// ARRAY_BITS
		//
		write_reg('h12, 32'd384);	// EXPONENT_BITS
		read_reg ('h12, tmp);
		//
		write_reg('h11, 32'd384);	// MODULUS_BITS
		read_reg ('h11, tmp);
		//
		//
	end
	
	task read_reg;
		input		[USE_OPERAND_ADDR_WIDTH+1:0]	addr;
		output	[                    32-1:0]	data;
		begin
			bus_cs = 1;
			bus_addr = {1'b0, addr};
			#10;
			bus_cs = 0;
			bus_addr = 'bX;
			data = bus_rd_data;
		end
	endtask

	task write_reg;
		input		[USE_OPERAND_ADDR_WIDTH+1:0]	addr;
		input		[                    32-1:0]	data;
		begin
			bus_cs = 1;
			bus_we = 1;
			bus_addr = {1'b0, addr};
			bus_wr_data = data;
			#10;
			bus_cs = 0;
			bus_we = 0;
			bus_addr = 'bX;
		end
	endtask
      
endmodule