Skip to content

Commit 898221b

Browse files
committed
Present memory sizes and DNA value in system info
Present the following memory dimensions in the system info: - Main memory (SRAM). - HyperRAM. - Portion of the HyperRAM that is supported by tag bits an may thus store capabilities. Make the DNA value of the FPGA available in the system info IP block; this is a 57-bit value programmed into the FPGA which is described as 'most often unique', although there may be up to 32 devices in the FPGA family which have the same DNA value. Model the DNA_PORT/value in simulation, using a single value for all simulations.
1 parent 0eeae8f commit 898221b

File tree

10 files changed

+525
-70
lines changed

10 files changed

+525
-70
lines changed

dv/models/fpga/rtl/DNA_PORT.v

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
// Copyright lowRISC contributors.
2+
// Licensed under the Apache License, Version 2.0, see LICENSE for details.
3+
// SPDX-License-Identifier: Apache-2.0
4+
5+
module DNA_PORT(
6+
input CLK,
7+
input READ,
8+
input SHIFT,
9+
input DIN,
10+
output DOUT
11+
);
12+
13+
reg [56:0] dna;
14+
always @(posedge CLK) begin
15+
if (READ) begin
16+
// This arbitrary number uniquely identifies the simulation model.
17+
dna <= 57'h1b8a94d_76732894;
18+
end else if (SHIFT) begin
19+
// User can extend the DNA value.
20+
dna <= {dna[55:0], DIN};
21+
end
22+
end
23+
assign DOUT = dna[56];
24+
25+
endmodule

rtl/ip/system_info/data/system_info.hjson

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -130,5 +130,74 @@
130130
},
131131
],
132132
},
133+
{ name: "DNA_CAPTURE",
134+
desc: '''Capture the `DNA value` of this Sonata device for reading via the `DNA` register.
135+
A write to this register will present the first bit of the DNA value in `DNA.`
136+
The value written does not matter.''',
137+
swaccess: "wo",
138+
hwaccess: "hro",
139+
hwqe: "true",
140+
hwext: "true",
141+
fields: [
142+
{ bits: "0",
143+
name: "CAPTURE"
144+
desc: '''Initiate reading of `DNA value`.''',
145+
},
146+
]
147+
}
148+
{ name: "DNA",
149+
desc: '''The next bit of the DNA value.
150+
Reading of the DNA value should be initiated by writing to `DNA_CAPTURE.`
151+
A single bit of the 57-bit DNA value is presented per read of the `DNA` register.
152+
Up to 32 FPGA devices within a family may have the same DNA value.''',
153+
swaccess: "ro",
154+
hwaccess: "hrw",
155+
hwre: "true",
156+
hwext: "true",
157+
fields: [
158+
{ bits: "0",
159+
name: "DNA"
160+
desc: '''Next bit of DNA value.''',
161+
},
162+
]
163+
}
164+
{ name: "MEM_SIZE",
165+
desc: '''Size of main memory (SRAM) in KiB.''',
166+
swaccess: "ro",
167+
hwaccess: "hwo",
168+
hwext: "true",
169+
fields: [
170+
{ bits: "31:0",
171+
name: "SIZE",
172+
desc: '''Size of main memory in KiB.''',
173+
},
174+
]
175+
}
176+
{ name: "HYPERRAM_SIZE",
177+
desc: '''Size of HyperRAM in KiB.''',
178+
swaccess: "ro",
179+
hwaccess: "hwo",
180+
hwext: "true",
181+
fields: [
182+
{ bits: "31:0",
183+
name: "SIZE",
184+
desc: '''Size of HyperRAM in KiB.''',
185+
},
186+
]
187+
}
188+
{ name: "HYPERRAM_TAG_SIZE",
189+
desc: '''Size of tagged portion of HyperRAM in KiB.
190+
It may be the case that only the first portion of the HyperRAM supports tags.
191+
Storing a capability within the remainder of the HyperRAM will raise an error.''',
192+
swaccess: "ro",
193+
hwaccess: "hwo",
194+
hwext: "true",
195+
fields: [
196+
{ bits: "31:0",
197+
name: "SIZE",
198+
desc: '''Size of tagged portion of HyperRAM in KiB.''',
199+
},
200+
]
201+
}
133202
],
134203
}

rtl/ip/system_info/rtl/system_info_reg_pkg.sv

Lines changed: 83 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,22 @@
77
package system_info_reg_pkg;
88

99
// Address widths within the block
10-
parameter int BlockAw = 5;
10+
parameter int BlockAw = 6;
1111

1212
////////////////////////////
1313
// Typedefs for registers //
1414
////////////////////////////
1515

16+
typedef struct packed {
17+
logic q;
18+
logic qe;
19+
} system_info_reg2hw_dna_capture_reg_t;
20+
21+
typedef struct packed {
22+
logic q;
23+
logic re;
24+
} system_info_reg2hw_dna_reg_t;
25+
1626
typedef struct packed {
1727
logic [31:0] d;
1828
} system_info_hw2reg_rtl_commit_hash_0_reg_t;
@@ -45,27 +55,58 @@ package system_info_reg_pkg;
4555
logic [7:0] d;
4656
} system_info_hw2reg_spi_info_reg_t;
4757

58+
typedef struct packed {
59+
logic d;
60+
} system_info_hw2reg_dna_reg_t;
61+
62+
typedef struct packed {
63+
logic [31:0] d;
64+
} system_info_hw2reg_mem_size_reg_t;
65+
66+
typedef struct packed {
67+
logic [31:0] d;
68+
} system_info_hw2reg_hyperram_size_reg_t;
69+
70+
typedef struct packed {
71+
logic [31:0] d;
72+
} system_info_hw2reg_hyperram_tag_size_reg_t;
73+
74+
// Register -> HW type
75+
typedef struct packed {
76+
system_info_reg2hw_dna_capture_reg_t dna_capture; // [3:2]
77+
system_info_reg2hw_dna_reg_t dna; // [1:0]
78+
} system_info_reg2hw_t;
79+
4880
// HW -> register type
4981
typedef struct packed {
50-
system_info_hw2reg_rtl_commit_hash_0_reg_t rtl_commit_hash_0; // [128:97]
51-
system_info_hw2reg_rtl_commit_hash_1_reg_t rtl_commit_hash_1; // [96:65]
52-
system_info_hw2reg_rtl_commit_dirty_reg_t rtl_commit_dirty; // [64:64]
53-
system_info_hw2reg_system_frequency_reg_t system_frequency; // [63:32]
54-
system_info_hw2reg_gpio_info_reg_t gpio_info; // [31:24]
55-
system_info_hw2reg_uart_info_reg_t uart_info; // [23:16]
56-
system_info_hw2reg_i2c_info_reg_t i2c_info; // [15:8]
57-
system_info_hw2reg_spi_info_reg_t spi_info; // [7:0]
82+
system_info_hw2reg_rtl_commit_hash_0_reg_t rtl_commit_hash_0; // [225:194]
83+
system_info_hw2reg_rtl_commit_hash_1_reg_t rtl_commit_hash_1; // [193:162]
84+
system_info_hw2reg_rtl_commit_dirty_reg_t rtl_commit_dirty; // [161:161]
85+
system_info_hw2reg_system_frequency_reg_t system_frequency; // [160:129]
86+
system_info_hw2reg_gpio_info_reg_t gpio_info; // [128:121]
87+
system_info_hw2reg_uart_info_reg_t uart_info; // [120:113]
88+
system_info_hw2reg_i2c_info_reg_t i2c_info; // [112:105]
89+
system_info_hw2reg_spi_info_reg_t spi_info; // [104:97]
90+
system_info_hw2reg_dna_reg_t dna; // [96:96]
91+
system_info_hw2reg_mem_size_reg_t mem_size; // [95:64]
92+
system_info_hw2reg_hyperram_size_reg_t hyperram_size; // [63:32]
93+
system_info_hw2reg_hyperram_tag_size_reg_t hyperram_tag_size; // [31:0]
5894
} system_info_hw2reg_t;
5995

6096
// Register offsets
61-
parameter logic [BlockAw-1:0] SYSTEM_INFO_RTL_COMMIT_HASH_0_OFFSET = 5'h 0;
62-
parameter logic [BlockAw-1:0] SYSTEM_INFO_RTL_COMMIT_HASH_1_OFFSET = 5'h 4;
63-
parameter logic [BlockAw-1:0] SYSTEM_INFO_RTL_COMMIT_DIRTY_OFFSET = 5'h 8;
64-
parameter logic [BlockAw-1:0] SYSTEM_INFO_SYSTEM_FREQUENCY_OFFSET = 5'h c;
65-
parameter logic [BlockAw-1:0] SYSTEM_INFO_GPIO_INFO_OFFSET = 5'h 10;
66-
parameter logic [BlockAw-1:0] SYSTEM_INFO_UART_INFO_OFFSET = 5'h 14;
67-
parameter logic [BlockAw-1:0] SYSTEM_INFO_I2C_INFO_OFFSET = 5'h 18;
68-
parameter logic [BlockAw-1:0] SYSTEM_INFO_SPI_INFO_OFFSET = 5'h 1c;
97+
parameter logic [BlockAw-1:0] SYSTEM_INFO_RTL_COMMIT_HASH_0_OFFSET = 6'h 0;
98+
parameter logic [BlockAw-1:0] SYSTEM_INFO_RTL_COMMIT_HASH_1_OFFSET = 6'h 4;
99+
parameter logic [BlockAw-1:0] SYSTEM_INFO_RTL_COMMIT_DIRTY_OFFSET = 6'h 8;
100+
parameter logic [BlockAw-1:0] SYSTEM_INFO_SYSTEM_FREQUENCY_OFFSET = 6'h c;
101+
parameter logic [BlockAw-1:0] SYSTEM_INFO_GPIO_INFO_OFFSET = 6'h 10;
102+
parameter logic [BlockAw-1:0] SYSTEM_INFO_UART_INFO_OFFSET = 6'h 14;
103+
parameter logic [BlockAw-1:0] SYSTEM_INFO_I2C_INFO_OFFSET = 6'h 18;
104+
parameter logic [BlockAw-1:0] SYSTEM_INFO_SPI_INFO_OFFSET = 6'h 1c;
105+
parameter logic [BlockAw-1:0] SYSTEM_INFO_DNA_CAPTURE_OFFSET = 6'h 20;
106+
parameter logic [BlockAw-1:0] SYSTEM_INFO_DNA_OFFSET = 6'h 24;
107+
parameter logic [BlockAw-1:0] SYSTEM_INFO_MEM_SIZE_OFFSET = 6'h 28;
108+
parameter logic [BlockAw-1:0] SYSTEM_INFO_HYPERRAM_SIZE_OFFSET = 6'h 2c;
109+
parameter logic [BlockAw-1:0] SYSTEM_INFO_HYPERRAM_TAG_SIZE_OFFSET = 6'h 30;
69110

70111
// Reset values for hwext registers and their fields
71112
parameter logic [31:0] SYSTEM_INFO_RTL_COMMIT_HASH_0_RESVAL = 32'h 0;
@@ -77,6 +118,11 @@ package system_info_reg_pkg;
77118
parameter logic [7:0] SYSTEM_INFO_UART_INFO_RESVAL = 8'h 0;
78119
parameter logic [7:0] SYSTEM_INFO_I2C_INFO_RESVAL = 8'h 0;
79120
parameter logic [7:0] SYSTEM_INFO_SPI_INFO_RESVAL = 8'h 0;
121+
parameter logic [0:0] SYSTEM_INFO_DNA_CAPTURE_RESVAL = 1'h 0;
122+
parameter logic [0:0] SYSTEM_INFO_DNA_RESVAL = 1'h 0;
123+
parameter logic [31:0] SYSTEM_INFO_MEM_SIZE_RESVAL = 32'h 0;
124+
parameter logic [31:0] SYSTEM_INFO_HYPERRAM_SIZE_RESVAL = 32'h 0;
125+
parameter logic [31:0] SYSTEM_INFO_HYPERRAM_TAG_SIZE_RESVAL = 32'h 0;
80126

81127
// Register index
82128
typedef enum int {
@@ -87,19 +133,29 @@ package system_info_reg_pkg;
87133
SYSTEM_INFO_GPIO_INFO,
88134
SYSTEM_INFO_UART_INFO,
89135
SYSTEM_INFO_I2C_INFO,
90-
SYSTEM_INFO_SPI_INFO
136+
SYSTEM_INFO_SPI_INFO,
137+
SYSTEM_INFO_DNA_CAPTURE,
138+
SYSTEM_INFO_DNA,
139+
SYSTEM_INFO_MEM_SIZE,
140+
SYSTEM_INFO_HYPERRAM_SIZE,
141+
SYSTEM_INFO_HYPERRAM_TAG_SIZE
91142
} system_info_id_e;
92143

93144
// Register width information to check illegal writes
94-
parameter logic [3:0] SYSTEM_INFO_PERMIT [8] = '{
95-
4'b 1111, // index[0] SYSTEM_INFO_RTL_COMMIT_HASH_0
96-
4'b 1111, // index[1] SYSTEM_INFO_RTL_COMMIT_HASH_1
97-
4'b 0001, // index[2] SYSTEM_INFO_RTL_COMMIT_DIRTY
98-
4'b 1111, // index[3] SYSTEM_INFO_SYSTEM_FREQUENCY
99-
4'b 0001, // index[4] SYSTEM_INFO_GPIO_INFO
100-
4'b 0001, // index[5] SYSTEM_INFO_UART_INFO
101-
4'b 0001, // index[6] SYSTEM_INFO_I2C_INFO
102-
4'b 0001 // index[7] SYSTEM_INFO_SPI_INFO
145+
parameter logic [3:0] SYSTEM_INFO_PERMIT [13] = '{
146+
4'b 1111, // index[ 0] SYSTEM_INFO_RTL_COMMIT_HASH_0
147+
4'b 1111, // index[ 1] SYSTEM_INFO_RTL_COMMIT_HASH_1
148+
4'b 0001, // index[ 2] SYSTEM_INFO_RTL_COMMIT_DIRTY
149+
4'b 1111, // index[ 3] SYSTEM_INFO_SYSTEM_FREQUENCY
150+
4'b 0001, // index[ 4] SYSTEM_INFO_GPIO_INFO
151+
4'b 0001, // index[ 5] SYSTEM_INFO_UART_INFO
152+
4'b 0001, // index[ 6] SYSTEM_INFO_I2C_INFO
153+
4'b 0001, // index[ 7] SYSTEM_INFO_SPI_INFO
154+
4'b 0001, // index[ 8] SYSTEM_INFO_DNA_CAPTURE
155+
4'b 0001, // index[ 9] SYSTEM_INFO_DNA
156+
4'b 1111, // index[10] SYSTEM_INFO_MEM_SIZE
157+
4'b 1111, // index[11] SYSTEM_INFO_HYPERRAM_SIZE
158+
4'b 1111 // index[12] SYSTEM_INFO_HYPERRAM_TAG_SIZE
103159
};
104160

105161
endpackage

0 commit comments

Comments
 (0)