mirror of
https://github.com/garrettsworkshop/Warp-LC.git
synced 2025-02-21 01:29:28 +00:00
207 lines
4.9 KiB
Verilog
207 lines
4.9 KiB
Verilog
`timescale 1ns / 1ps
|
|
//////////////////////////////////////////////////////////////////////////////////
|
|
// Company:
|
|
// Engineer:
|
|
//
|
|
// Create Date: 06:27:24 10/29/2021
|
|
// Design Name:
|
|
// Module Name: WarpLC
|
|
// Project Name:
|
|
// Target Devices:
|
|
// Tool versions:
|
|
// Description:
|
|
//
|
|
// Dependencies:
|
|
//
|
|
// Revision:
|
|
// Revision 0.01 - File Created
|
|
// Additional Comments:
|
|
//
|
|
//////////////////////////////////////////////////////////////////////////////////
|
|
module WarpLC(
|
|
(* IOSTANDARD = "LVCMOS33" *)
|
|
(* IOBDELAY = "NONE" *)
|
|
input CPU_nAS,
|
|
|
|
(* IOSTANDARD = "LVCMOS33" *)
|
|
(* IOBDELAY = "NONE" *)
|
|
input [31:0] FSB_A,
|
|
|
|
(* IOSTANDARD = "LVCMOS33" *)
|
|
(* IOBDELAY = "NONE" *)
|
|
input [1:0] FSB_SIZ,
|
|
|
|
(* IOSTANDARD = "LVCMOS33" *)
|
|
(* DRIVE = "8" *)
|
|
(* SLEW = "SLOW" *)
|
|
output [31:0] FSB_D,
|
|
|
|
(* IOSTANDARD = "LVCMOS33" *)
|
|
(* DRIVE = "24" *)
|
|
(* SLEW = "FAST" *)
|
|
output CPU_nSTERM,
|
|
|
|
(* IOSTANDARD = "LVCMOS33" *)
|
|
(* DRIVE = "24" *)
|
|
(* SLEW = "FAST" *)
|
|
output CPUCLK,
|
|
|
|
(* IOSTANDARD = "LVCMOS33" *)
|
|
(* DRIVE = "24" *)
|
|
(* SLEW = "FAST" *)
|
|
output FPUCLK,
|
|
|
|
(* IOSTANDARD = "LVCMOS33" *)
|
|
(* DRIVE = "24" *)
|
|
(* SLEW = "FAST" *)
|
|
output RAMCLK0,
|
|
|
|
(* IOSTANDARD = "LVCMOS33" *)
|
|
(* DRIVE = "24" *)
|
|
(* SLEW = "FAST" *)
|
|
output RAMCLK1,
|
|
|
|
(* IOSTANDARD = "LVCMOS33" *)
|
|
(* IOBDELAY = "NONE" *)
|
|
input CLKIN,
|
|
|
|
(* IOSTANDARD = "LVCMOS33" *)
|
|
(* IOBDELAY = "NONE" *)
|
|
input CLKFB_IN,
|
|
|
|
(* IOSTANDARD = "LVCMOS33" *)
|
|
(* DRIVE = "24" *)
|
|
(* SLEW = "FAST" *)
|
|
output CLKFB_OUT);
|
|
|
|
wire FSBCLK;
|
|
wire CPUCLKr;
|
|
ClkGen cg (
|
|
.CLKIN(CLKIN),
|
|
.CLKFB_IN(CLKFB_IN),
|
|
.CLKFB_OUT(CLKFB_OUT),
|
|
.FSBCLK(FSBCLK),
|
|
.CPUCLKr(CPUCLKr),
|
|
.CPUCLK(CPUCLK),
|
|
.FPUCLK(FPUCLK),
|
|
.RAMCLK0(RAMCLK0),
|
|
.RAMCLK1(RAMCLK1));
|
|
|
|
wire FSB_SEL_RAM, FSB_SEL_ROM, FSB_VRAM, FSB_SEL_Cache;
|
|
wire [27:0] FSB_CA;
|
|
CS cs(
|
|
.A(FSB_A),
|
|
.RAMCS(FSB_SEL_RAM),
|
|
.ROMCS(FSB_SEL_ROM),
|
|
.VRAMCS(FSB_VRAM),
|
|
.CacheCS(FSB_SEL_Cache),
|
|
.CA(FSB_CA));
|
|
|
|
wire [3:0] FSB_B;
|
|
SizeDecode sd (
|
|
.A(FSB_A[1:0]),
|
|
.SIZ(FSB_SIZ[1:0]),
|
|
.B(FSB_B[3:0]));
|
|
|
|
wire L2PrefetchMatch;
|
|
wire [31:0] L2PrefetchRDD;
|
|
L2Prefetch prefetch (
|
|
.CLK(FSBCLK),
|
|
.CPUCLKr(CPUCLKr),
|
|
|
|
.RDA({FSB_A[30], FSB_A[28], FSB_A[25:2]}),
|
|
.RDD(L2PrefetchRDD),
|
|
.Match(L2PrefetchMatch),
|
|
|
|
.WRA(28'b0),
|
|
.WRD(32'b0),
|
|
.WR(1'b0),
|
|
.WRM(4'b0),
|
|
.CLR(1'b0));
|
|
|
|
wire L2CacheMatch;
|
|
wire [31:0] L2CacheRDD;
|
|
L2Cache cache (
|
|
.CLK(CLK),
|
|
.CPUCLKr(CPUCLKr),
|
|
|
|
.RDA({FSB_A[30], FSB_A[28], FSB_A[25:2]}),
|
|
.RDD(L2CacheRDD),
|
|
.Match(L2CacheMatch),
|
|
|
|
.WRA(28'b0),
|
|
.WRD(32'b0),
|
|
.WRM(4'b0),
|
|
.TS(1'b0),
|
|
.WR(1'b0),
|
|
.CLR(1'b0),
|
|
.ALL(1'b0));
|
|
|
|
assign FSB_D[31:0] = L2PrefetchMatch ? L2PrefetchRDD[31:0] :
|
|
L2CacheMatch ? L2CacheRDD[31:0] : 0;
|
|
|
|
reg STERMEN = 0;
|
|
reg STERM = 0;
|
|
assign CPU_nSTERM = ~((L2PrefetchMatch && STERMEN) || STERM);
|
|
|
|
endmodule
|
|
|
|
|
|
|
|
/* Cacheable areas of RAM
|
|
* ...
|
|
* 0x50FBFFFF VRAM 0101 0000 1111 10XX XXXX XXXX XXXX XXXX
|
|
* 0x50F80000
|
|
* 0x50F7FFFF VRAM 0101 0000 1111 01XX XXXX XXXX XXXX XXXX
|
|
* 0x50F40000
|
|
* ...
|
|
* 0x40FFFFFF ROM alias? 0100 0000 111X XXXX XXXX XXXX XXXX XXXX
|
|
* 0x40E00000
|
|
* 0x40DFFFFF ROM 0100 0000 110X XXXX XXXX XXXX XXXX XXXX
|
|
* 0x40C00000
|
|
* 0x40BFFFFF ROM 0100 0000 101X XXXX XXXX XXXX XXXX XXXX
|
|
* 0x40A00000
|
|
* 0x409FFFFF ROM alias? 0100 0000 100X XXXX XXXX XXXX XXXX XXXX
|
|
* 0x40800000
|
|
* 0x407FFFFF ROM alias? 0100 0000 011X XXXX XXXX XXXX XXXX XXXX
|
|
* 0x40600000
|
|
* 0x405FFFFF ROM alias? 0100 0000 010X XXXX XXXX XXXX XXXX XXXX
|
|
* 0x40400000
|
|
* 0x403FFFFF ROM alias? 0100 0000 001X XXXX XXXX XXXX XXXX XXXX
|
|
* 0x40200000
|
|
* 0x401FFFFF ROM alias? 0100 0000 000X XXXX XXXX XXXX XXXX XXXX
|
|
* 0x40000000
|
|
* 0x3FFFFFFF RAM alias? 0011 11XX XXXX XXXX XXXX XXXX XXXX XXXX
|
|
* 0x3C000000
|
|
* 0x3BFFFFFF RAM alias? 0011 10XX XXXX XXXX XXXX XXXX XXXX XXXX
|
|
* 0x38000000
|
|
* 0x37FFFFFF RAM alias? 0011 01XX XXXX XXXX XXXX XXXX XXXX XXXX
|
|
* 0x34000000
|
|
* 0x33FFFFFF RAM alias? 0011 00XX XXXX XXXX XXXX XXXX XXXX XXXX
|
|
* 0x30000000
|
|
* 0x2FFFFFFF RAM alias? 0010 11XX XXXX XXXX XXXX XXXX XXXX XXXX
|
|
* 0x2C000000
|
|
* 0x2BFFFFFF RAM alias? 0010 10XX XXXX XXXX XXXX XXXX XXXX XXXX
|
|
* 0x28000000
|
|
* 0x27FFFFFF RAM alias? 0010 01XX XXXX XXXX XXXX XXXX XXXX XXXX
|
|
* 0x24000000
|
|
* 0x23FFFFFF RAM alias? 0010 00XX XXXX XXXX XXXX XXXX XXXX XXXX
|
|
* 0x20000000
|
|
* 0x1FFFFFFF RAM alias? 0001 11XX XXXX XXXX XXXX XXXX XXXX XXXX
|
|
* 0x1C000000
|
|
* 0x1BFFFFFF RAM alias? 0001 10XX XXXX XXXX XXXX XXXX XXXX XXXX
|
|
* 0x18000000
|
|
* 0x17FFFFFF RAM alias? 0001 01XX XXXX XXXX XXXX XXXX XXXX XXXX
|
|
* 0x14000000
|
|
* 0x13FFFFFF RAM alias? 0001 00XX XXXX XXXX XXXX XXXX XXXX XXXX
|
|
* 0x10000000
|
|
* 0x0FFFFFFF RAM alias? 0000 11XX XXXX XXXX XXXX XXXX XXXX XXXX
|
|
* 0x0C000000
|
|
* 0x0BFFFFFF RAM alias? 0000 10XX XXXX XXXX XXXX XXXX XXXX XXXX
|
|
* 0x08000000
|
|
* 0x07FFFFFF RAM alias? 0000 01XX XXXX XXXX XXXX XXXX XXXX XXXX
|
|
* 0x04000000
|
|
* 0x03FFFFFF RAM (26 bits) 0000 00XX XXXX XXXX XXXX XXXX XXXX XXXX
|
|
* 0x00000000
|
|
*/
|
|
|