aboutsummaryrefslogtreecommitdiff
path: root/rtl/src/verilog/novena_regs.v
blob: 88b35abf821d5704d3fffaf20e367656f2b59de3 (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
`timescale 1ns / 1ps

module novena_regs
	(
		input		wire  				clk,
		input		wire					rst,

		input		wire  				cs,
		input		wire  				we,

		input		wire 	[ 7 : 0]		address,
		input		wire  [31 : 0]		write_data,
		output	wire	[31 : 0]		read_data
	);


	//----------------------------------------------------------------
	// Board-Level Registers
	//----------------------------------------------------------------
	localparam	ADDR_BOARD_TYPE		= 8'h00;		// board id
	localparam	ADDR_FIRMWARE_VER		= 8'h01;		// bitstream version
	localparam	ADDR_DUMMY_REG			= 8'hFF;		// general-purpose register


	//----------------------------------------------------------------
	// Constants
	//----------------------------------------------------------------
	localparam	NOVENA_BOARD_TYPE		= 32'h50565431;		// PVT1
	localparam	NOVENA_DESIGN_VER		= 32'h00_01_00_0b;	// v0.1.0b


		//
		// Output Register
		//
	reg	[31: 0]	tmp_read_data;
	assign read_data = tmp_read_data;
	

		/* This dummy register can be used by users to check that they can actually write something.
		 */
	 
	reg	[31: 0]	reg_dummy;
	
	
		//
		// Access Handler
		//
	always @(posedge clk)
		//
		if (rst)	reg_dummy <= {32{1'b0}};
		else if (cs) begin
			//
			if (we) begin
				//
				// WRITE handler
				//
				case (address)
					ADDR_DUMMY_REG:	reg_dummy	<= write_data;
				endcase
				//
			end else begin
				//
				// READ handler
				//
				case (address)
					ADDR_BOARD_TYPE:		tmp_read_data	<= NOVENA_BOARD_TYPE;
					ADDR_FIRMWARE_VER:	tmp_read_data	<= NOVENA_DESIGN_VER;
					ADDR_DUMMY_REG:		tmp_read_data	<= reg_dummy;
					//
					default:					tmp_read_data	<= {32{1'b0}};	// read non-existent locations as zeroes
					/*
               default:					tmp_read_data	<= {32{1'bX}};	// don't care what to read from non-existent locations
					*/
				endcase
				//
			end
			//
		end

endmodule