mirror of
https://github.com/tillitis/tillitis-key1.git
synced 2025-05-02 06:06:24 -04:00
FPGA: Move RAM address and data scrambling into the RAM module.
Move the logic implementing the RAM address and data scrambling, descrambling into the RAM module. This cleans up the top level, and makes it easier to change the scrambling without chaning the top. In order to do correct scrambling the address to the RAM core must be 16 bits, not 15. Clean up some minor details at the top level, fixing text aligment and grouping of ports in instances. Signed-off-by: Joachim Strömbergson <joachim@assured.se>
This commit is contained in:
parent
8d4ad120d6
commit
35052e50cb
4 changed files with 57 additions and 21 deletions
|
@ -6,6 +6,10 @@
|
|||
// iCE40UP 5K device. This creates a single 32-bit wide,
|
||||
// 128 kByte large memory.
|
||||
//
|
||||
// The block also implements data and address scrambling controlled
|
||||
// by the ram_addr_rand and ram_data_rand seeds.
|
||||
//
|
||||
//
|
||||
// Author: Joachim Strombergson
|
||||
// Copyright (C) 2022 - Tillitis AB
|
||||
// SPDX-License-Identifier: GPL-2.0-only
|
||||
|
@ -17,9 +21,13 @@
|
|||
module ram(
|
||||
input wire clk,
|
||||
input wire reset_n,
|
||||
|
||||
input wire [14 : 0] ram_addr_rand,
|
||||
input wire [31 : 0] ram_data_rand,
|
||||
|
||||
input wire cs,
|
||||
input wire [03 : 0] we,
|
||||
input wire [14 : 0] address,
|
||||
input wire [15 : 0] address,
|
||||
input wire [31 : 0] write_data,
|
||||
output wire [31 : 0] read_data,
|
||||
output wire ready
|
||||
|
@ -29,7 +37,7 @@ module ram(
|
|||
//----------------------------------------------------------------
|
||||
// Registers and wires.
|
||||
//----------------------------------------------------------------
|
||||
reg ready_reg;
|
||||
reg ready_reg;
|
||||
|
||||
reg cs0;
|
||||
reg cs1;
|
||||
|
@ -37,11 +45,15 @@ module ram(
|
|||
reg [31 : 0] read_data1;
|
||||
reg [31 : 0] muxed_read_data;
|
||||
|
||||
reg [14 : 0] scrambled_ram_addr;
|
||||
reg [31 : 0] scrambled_write_data;
|
||||
reg [31 : 0] descrambled_read_data;
|
||||
|
||||
|
||||
//----------------------------------------------------------------
|
||||
// Concurrent assignment of ports.
|
||||
//----------------------------------------------------------------
|
||||
assign read_data = muxed_read_data;
|
||||
assign read_data = descrambled_read_data;
|
||||
assign ready = ready_reg;
|
||||
|
||||
|
||||
|
@ -49,8 +61,8 @@ module ram(
|
|||
// SPRAM instances.
|
||||
//----------------------------------------------------------------
|
||||
SB_SPRAM256KA spram0(
|
||||
.ADDRESS(address[13:0]),
|
||||
.DATAIN(write_data[15:0]),
|
||||
.ADDRESS(scrambled_ram_addr[13:0]),
|
||||
.DATAIN(scrambled_write_data[15:0]),
|
||||
.MASKWREN({we[1], we[1], we[0], we[0]}),
|
||||
.WREN(we[1] | we[0]),
|
||||
.CHIPSELECT(cs0),
|
||||
|
@ -62,8 +74,8 @@ module ram(
|
|||
);
|
||||
|
||||
SB_SPRAM256KA spram1(
|
||||
.ADDRESS(address[13:0]),
|
||||
.DATAIN(write_data[31:16]),
|
||||
.ADDRESS(scrambled_ram_addr[13:0]),
|
||||
.DATAIN(scrambled_write_data[31:16]),
|
||||
.MASKWREN({we[3], we[3], we[2], we[2]}),
|
||||
.WREN(we[3] | we[2]),
|
||||
.CHIPSELECT(cs0),
|
||||
|
@ -76,8 +88,8 @@ module ram(
|
|||
|
||||
|
||||
SB_SPRAM256KA spram2(
|
||||
.ADDRESS(address[13:0]),
|
||||
.DATAIN(write_data[15:0]),
|
||||
.ADDRESS(scrambled_ram_addr[13:0]),
|
||||
.DATAIN(scrambled_write_data[15:0]),
|
||||
.MASKWREN({we[1], we[1], we[0], we[0]}),
|
||||
.WREN(we[1] | we[0]),
|
||||
.CHIPSELECT(cs1),
|
||||
|
@ -89,8 +101,8 @@ module ram(
|
|||
);
|
||||
|
||||
SB_SPRAM256KA spram3(
|
||||
.ADDRESS(address[13:0]),
|
||||
.DATAIN(write_data[31:16]),
|
||||
.ADDRESS(scrambled_ram_addr[13:0]),
|
||||
.DATAIN(scrambled_write_data[31:16]),
|
||||
.MASKWREN({we[3], we[3], we[2], we[2]}),
|
||||
.WREN(we[3] | we[2]),
|
||||
.CHIPSELECT(cs1),
|
||||
|
@ -120,15 +132,32 @@ module ram(
|
|||
end
|
||||
|
||||
|
||||
//----------------------------------------------------------------
|
||||
// scramble_descramble
|
||||
//
|
||||
// Scramble address and write data, and descramble read data using
|
||||
// the ram_addr_rand and ram_data_rand seeds.
|
||||
//----------------------------------------------------------------
|
||||
always @*
|
||||
begin: scramble_descramble
|
||||
scrambled_ram_addr = address[14 : 0] ^ ram_addr_rand;
|
||||
scrambled_write_data = write_data ^ ram_data_rand ^ {2{address}};
|
||||
descrambled_read_data = muxed_read_data ^ ram_data_rand ^ {2{address}};
|
||||
end
|
||||
|
||||
|
||||
//----------------------------------------------------------------
|
||||
// mem_mux
|
||||
//
|
||||
// Select which of the data read from the banks should be
|
||||
// returned during a read access.
|
||||
//----------------------------------------------------------------
|
||||
always @*
|
||||
begin : mem_mux
|
||||
cs0 = ~address[14] & cs;
|
||||
cs1 = address[14] & cs;
|
||||
cs0 = ~scrambled_ram_addr[14] & cs;
|
||||
cs1 = scrambled_ram_addr[14] & cs;
|
||||
|
||||
if (address[14]) begin
|
||||
if (scrambled_ram_addr[14]) begin
|
||||
muxed_read_data = read_data1;
|
||||
end else begin
|
||||
muxed_read_data = read_data0;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue