OpenCores
URL https://opencores.org/ocsvn/thor/thor/trunk

Subversion Repositories thor

Compare Revisions

  • This comparison shows the changes necessary to convert path
    /
    from Rev 17 to Rev 18
    Reverse comparison

Rev 17 → Rev 18

/thor/trunk/rtl/verilog/Thor.v
106,9 → 106,9
parameter DBW = 32; // databus width
parameter ABW = 32; // address bus width
parameter RSTCSEG = 52'h0;
parameter RSTPC = 64'hFFFFFFFFFFFFEFF0;
parameter RSTPC = 64'hFFFFFFFFFFFC0000;
parameter STARTUP_POWER = 16'hFFFF;
parameter IMCD = 6'h3E;
parameter IMCD = 6'h30;
localparam AMSB = ABW-1;
parameter QENTRIES = 8;
parameter ALU1BIG = 0;
1051,7 → 1051,7
8'h0D: fnFunc = isn[23:22];
8'h0E: fnFunc = isn[23:22];
8'h0F: fnFunc = isn[23:22];
`INC: fnFunc = isn[24:22];
`INC: fnFunc = {isn[39:37],isn[24:22]};
`TLB: fnFunc = isn[19:16];
`RTS: fnFunc = isn[19:16]; // used to pass a small immediate
`CACHE: fnFunc = isn[31:26];
1229,7 → 1229,7
fnSource2_v = `TRUE;
else
fnSource2_v = `FALSE;
`CACHE,`LCL,`TLB,`LLA,
`CACHE,`LCL,`TLB,`LLA,`LEA,
`LVB,`LVC,`LVH,`LVW,`LVWAR,
`LB,`LBU,`LC,`LCU,`LH,`LHU,`LW,`LWS,`STI,`INC:
fnSource2_v = 1'b1;
1302,7 → 1302,7
fnNumReadPorts = 3'd1;
else
fnNumReadPorts = 3'd2;
`CACHE,`LCL,`TLB,`LLA,
`CACHE,`LCL,`TLB,`LLA,`LEA,
`LB,`LBU,`LC,`LCU,`LH,`LHU,`LW,`LVB,`LVC,`LVH,`LVW,`LVWAR,`LWS,`INC:
fnNumReadPorts = 3'd1;
`JSR,`JSRS,`JSRZ,`SYS,`INT,`RTS,`RTS2,`BR:
1452,7 → 1452,7
);
`endif
 
Thor_icachemem #(DBW) uicm1
Thor_icachemem #(.DBW(DBW),.ABW(ABW)) uicm1
(
.wclk(clk),
.wce(cstate==ICACHE1),
1602,7 → 1602,7
`ADDI,`ADDUI,`SUBI,`SUBUI,
`MULI,`MULUI,`DIVI,`DIVUI,`MODI,`MODUI,
`_2ADDUI,`_4ADDUI,`_8ADDUI,`_16ADDUI,
`ANDI,`ORI,`EORI,`LLA,
`ANDI,`ORI,`EORI,`LLA,`LEA,
`LVB,`LVC,`LVH,`LVW,`LVWAR,
`LB,`LBU,`LC,`LCU,`LH,`LHU,`LW,`LINK:
fnTargetReg = {1'b0,ir[27:22]};
1951,7 → 1951,7
opcode==`LB || opcode==`LBU || opcode==`LC || opcode==`LCU || opcode==`LH || opcode==`LHU || opcode==`LW ||
opcode==`LBX || opcode==`LBUX || opcode==`LCX || opcode==`LCUX || opcode==`LHX || opcode==`LHUX || opcode==`LWX ||
opcode==`LVB || opcode==`LVH || opcode==`LVC || opcode==`LVW || opcode==`LVWAR || opcode==`SWCR ||
opcode==`STP || opcode==`LLA || opcode==`LLAX ||
opcode==`STP || opcode==`LLA || opcode==`LLAX || opcode==`LEA ||
opcode==`CAS || opcode==`LWS || opcode==`STMV || opcode==`STCMP || opcode==`STFND ||
opcode==`STS || opcode==`PUSH || opcode==`POP || opcode==`LINK || opcode==`UNLINK ||
opcode==`JMPI || opcode==`JMPIX ||
2063,7 → 2063,7
else
fnIsIllegal = `FALSE;
8'h43,8'h44,8'h45: fnIsIllegal = `TRUE;
8'h52,8'h56,8'h57,8'h59,8'h5A,8'h5C,8'h5D,8'h5E:
8'h52,8'h56,8'h57,8'h59,8'h5A,8'h5D,8'h5E:
fnIsIllegal = `TRUE;
8'h60,8'h61,8'h62,8'h63,8'h64,8'h65,8'h66,8'h67,8'h68,8'h69:
fnIsIllegal = `TRUE;
2585,7 → 2585,7
`STI: fnImm = {{58{insn[33]}},insn[33:28]};
`PUSH: fnImm = 64'hFFFFFFFFFFFFFFF8; //-8
//`LINK: fnImm = {insn[39:28],3'b000};
`JMPI,`LLA,
`JMPI,`LLA,`LEA,
`LB,`LBU,`LC,`LCU,`LH,`LHU,`LW,`LVB,`LVC,`LVH,`LVW,`LVWAR,
`SB,`SC,`SH,`SW,`SWCR,`LWS,`SWS,`INC,`LCL,`PEA:
fnImm = {{55{insn[36]}},insn[36:28]};
2619,7 → 2619,7
`ifdef STACKOPS
`LINK: fnImm8 = {insn[32:28],3'b000};
`endif
`JMPI,`LLA,
`JMPI,`LLA,`LEA,
`LB,`LBU,`LC,`LCU,`LH,`LHU,`LW,`LVB,`LVC,`LVH,`LVW,`LVWAR,
`SB,`SC,`SH,`SW,`SWCR,`LWS,`SWS,`INC,`LCL,`PEA:
fnImm8 = insn[35:28];
2655,7 → 2655,7
`LBX,`LBUX,`LCX,`LCUX,`LHX,`LHUX,`LWX,
`SBX,`SCX,`SHX,`SWX:
fnImmMSB = insn[47];
`JMPI,`LLA,
`JMPI,`LLA,`LEA,
`LB,`LBU,`LC,`LCU,`LH,`LHU,`LW,`LVB,`LVC,`LVH,`LVW,
`SB,`SC,`SH,`SW,`SWCR,`STI,`LWS,`SWS,`INC,`LCL,`PEA:
fnImmMSB = insn[36];
4233,19 → 4233,19
// What if there's a databus error during the store ?
// set the IQ entry == DONE as soon as the SW is let loose to the memory system
//
if (dram0 == 2'd2 && fnIsStore(dram0_op) && dram0_op != `STS && dram0_op != `STMV) begin
if (dram0 == 2'd2 && fnIsStore(dram0_op) && dram0_op != `STS && dram0_op != `STMV && dram0_op != `SWCR) begin
if ((alu0_v && dram0_id[2:0] == alu0_id[2:0]) || (alu1_v && dram0_id[2:0] == alu1_id[2:0])) panic <= `PANIC_MEMORYRACE;
iqentry_done[ dram0_id[2:0] ] <= `TRUE;
iqentry_cmt [ dram0_id[2:0]] <= `TRUE;
iqentry_out[ dram0_id[2:0] ] <= `FALSE;
end
if (dram1 == 2'd2 && fnIsStore(dram1_op) && dram1_op != `STS && dram1_op != `STMV) begin
if (dram1 == 2'd2 && fnIsStore(dram1_op) && dram1_op != `STS && dram1_op != `STMV && dram1_op != `SWCR) begin
if ((alu0_v && dram1_id[2:0] == alu0_id[2:0]) || (alu1_v && dram1_id[2:0] == alu1_id[2:0])) panic <= `PANIC_MEMORYRACE;
iqentry_done[ dram1_id[2:0] ] <= `TRUE;
iqentry_cmt [ dram1_id[2:0]] <= `TRUE;
iqentry_out[ dram1_id[2:0] ] <= `FALSE;
end
if (dram2 == 2'd2 && fnIsStore(dram2_op) && dram2_op != `STS && dram2_op != `STMV) begin
if (dram2 == 2'd2 && fnIsStore(dram2_op) && dram2_op != `STS && dram2_op != `STMV && dram2_op != `SWCR) begin
if ((alu0_v && dram2_id[2:0] == alu0_id[2:0]) || (alu1_v && dram2_id[2:0] == alu1_id[2:0])) panic <= `PANIC_MEMORYRACE;
iqentry_done[ dram2_id[2:0] ] <= `TRUE;
iqentry_cmt [ dram2_id[2:0]] <= `TRUE;
5695,7 → 5695,7
$stop;
if (fetchbuf0_pc==32'hF44)
$stop;
if (fetchbuf0_pc==32'hFFFFD09B)
if (fetchbuf0_pc==32'hFFFC2F71)
$stop;
`ifdef SEGMENTATION
`ifdef SEGLIMITS
5878,10 → 5878,8
input test_stomp;
input validate_args;
begin
if (`FALSE)
;
// if (opcode0==`NOP)
// queued1 = `TRUE; // to update fetch buffers
if (opcode0==`NOP)
queued1 = `TRUE; // to update fetch buffers
`ifdef DEBUG_LOGIC
else
if (dbg_ctrl[7] && !StatusDBG) begin
5931,7 → 5929,7
$stop;
if (fetchbuf1_pc==32'hF44)
$stop;
if (fetchbuf1_pc==32'hFFFFD09B)
if (fetchbuf1_pc==32'hFFFC2F71)
$stop;
`ifdef SEGMENTATION
`ifdef SEGLIMITS
6047,12 → 6045,10
input test_stomp;
input validate_args;
begin
if (`FALSE)
;
// if (opcode1==`NOP) begin
// if (queued1==`TRUE) queued2 = `TRUE;
// queued1 = `TRUE;
// end
if (opcode1==`NOP) begin
if (queued1==`TRUE) queued2 = `TRUE;
queued1 = `TRUE;
end
`ifdef DEBUG_LOGIC
else
if (dbg_ctrl[7] && !StatusDBG) begin
/thor/trunk/rtl/verilog/Thor_alu.v
288,7 → 288,7
o <= 64'hDEADDEADDEADDEAD;
*/
 
`ADDI,`ADDUI,`ADDUIS:
`ADDI,`ADDUI,`ADDUIS,`LEA:
o <= alu_argA + alu_argI;
`SUBI,`SUBUI:
o <= alu_argA - alu_argI;
/thor/trunk/rtl/verilog/Thor_icachemem.v
1,6 → 1,6
// ============================================================================
// __
// \\__/ o\ (C) 2013,2015 Robert Finch, Stratford
// \\__/ o\ (C) 2013-2016 Robert Finch, Stratford
// \ __ / All rights reserved.
// \/_// robfinch<remove>@finitron.ca
// ||
25,119 → 25,75
//
module Thor_icachemem(wclk, wce, wr, wa, wd, rclk, pc, insn);
parameter DBW=64;
parameter ABW=32;
input wclk;
input wce;
input wr;
input [DBW-1:0] wa;
input [ABW-1:0] wa;
input [DBW-1:0] wd;
input rclk;
input [DBW-1:0] pc;
input [ABW-1:0] pc;
output reg [127:0] insn;
 
wire [127:0] mem0a;
wire [127:0] mem1a;
reg [14:0] pcp16;
wire [127:0] insn0;
wire [127:0] insn1;
 
generate
begin : gen1
if (DBW==32) begin
syncRam2kx32_1w1r uicm0a0 (
.wclk(wclk),
.wce(wce && wa[3:2]==2'b00),
.wr({4{wr}}),
.wa(wa[14:4]),
.wd(wd),
.rclk(rclk),
.rce(1'b1),
.ra(pc[14:4]),
.o(mem0a[31:0])
);
syncRam2kx32_1w1r uicm0a1 (
.wclk(wclk),
.wce(wce && wa[3:2]==2'b01),
.wr({4{wr}}),
.wa(wa[14:4]),
.wd(wd),
.rclk(rclk),
.rce(1'b1),
.ra(pc[14:4]),
.o(mem0a[63:32])
);
syncRam2kx32_1w1r uicm0a2 (
.wclk(wclk),
.wce(wce && wa[3:2]==2'b10),
.wr({4{wr}}),
.wa(wa[14:4]),
.wd(wd),
.rclk(rclk),
.rce(1'b1),
.ra(pc[14:4]),
.o(mem0a[95:64])
);
syncRam2kx32_1w1r uicm0a3 (
.wclk(wclk),
.wce(wce && wa[3:2]==2'b11),
.wr({4{wr}}),
.wa(wa[14:4]),
.wd(wd),
.rclk(rclk),
.rce(1'b1),
.ra(pc[14:4]),
.o(mem0a[127:96])
);
begin : cache_mem
if (DBW==32) begin
blk_mem_gen_0 uicm1 (
.clka(wclk), // input wire clka
.ena(wce), // input wire ena
.wea(wr), // input wire [0 : 0] wea
.addra(wa[14:2]), // input wire [14 : 0] addra
.dina(wd), // input wire [31 : 0] dina
.clkb(rclk), // input wire clkb
.enb(1'b1),
.addrb(pc[14:4]), // input wire [12 : 0] addrb
.doutb(insn0) // output wire [127 : 0] doutb
);
 
syncRam2kx32_1w1r uicm1a0 (
.wclk(wclk),
.wce(wce && wa[3:2]==2'b00),
.wr({4{wr}}),
.wa(wa[14:4]),
.wd(wd),
.rclk(rclk),
.rce(1'b1),
.ra(pcp16[14:4]),
.o(mem1a[31:0])
);
syncRam2kx32_1w1r uicm1a1 (
.wclk(wclk),
.wce(wce && wa[3:2]==2'b01),
.wr({4{wr}}),
.wa(wa[14:4]),
.wd(wd),
.rclk(rclk),
.rce(1'b1),
.ra(pcp16[14:4]),
.o(mem1a[63:32])
);
syncRam2kx32_1w1r uicm1a2 (
.wclk(wclk),
.wce(wce && wa[3:2]==2'b10),
.wr({4{wr}}),
.wa(wa[14:4]),
.wd(wd),
.rclk(rclk),
.rce(1'b1),
.ra(pcp16[14:4]),
.o(mem1a[95:64])
);
syncRam2kx32_1w1r uicm1a3 (
.wclk(wclk),
.wce(wce && wa[3:2]==2'b11),
.wr({4{wr}}),
.wa(wa[14:4]),
.wd(wd),
.rclk(rclk),
.rce(1'b1),
.ra(pcp16[14:4]),
.o(mem1a[127:96])
);
end
blk_mem_gen_0 uicm2 (
.clka(wclk), // input wire clka
.ena(wce), // input wire ena
.wea(wr), // input wire [0 : 0] wea
.addra(wa[14:2]), // input wire [14 : 0] addra
.dina(wd), // input wire [31 : 0] dina
.clkb(rclk), // input wire clkb
.enb(1'b1),
.addrb(pc[14:4]+11'd1), // input wire [12 : 0] addrb
.doutb(insn1) // output wire [127 : 0] doutb
);
end
else begin
blk_mem_gen_1 uicm1 (
.clka(wclk), // input wire clka
.ena(wce), // input wire ena
.wea(wr), // input wire [0 : 0] wea
.addra(wa[14:3]), // input wire [14 : 0] addra
.dina(wd), // input wire [31 : 0] dina
.clkb(rclk), // input wire clkb
.enb(1'b1),
.addrb(pc[14:4]), // input wire [12 : 0] addrb
.doutb(insn0) // output wire [127 : 0] doutb
);
 
blk_mem_gen_1 uicm2 (
.clka(wclk), // input wire clka
.ena(wce), // input wire ena
.wea(wr), // input wire [0 : 0] wea
.addra(wa[14:3]), // input wire [14 : 0] addra
.dina(wd), // input wire [31 : 0] dina
.clkb(rclk), // input wire clkb
.enb(1'b1),
.addrb(pc[14:4]+11'd1), // input wire [12 : 0] addrb
.doutb(insn1) // output wire [127 : 0] doutb
);
end
 
end
endgenerate
 
always @(pc)
pcp16 <= pc[14:0] + 15'd16;
wire [127:0] insn0 = mem0a;
wire [127:0] insn1 = mem1a;
always @(pc or insn0 or insn1)
case(pc[3:0])
4'd0: insn <= insn0;
/thor/trunk/rtl/verilog/Thor_pic.v
141,7 → 141,7
rste <= 16'h0;
end
else begin
rste <= 16'h0;
rste <= 16'h0;
if (cs & we_i) begin
case (adr_i[5:3])
3'd0,3'd1:
149,9 → 149,10
ie[15:0] <= dat_i[15:0];
end
3'd2,3'd3:
ie[dat_i[3:0]] <= adr_i[2];
ie[dat_i[3:0]] <= adr_i[3];
3'd4: es <= dat_i[15:0];
3'd5: rste[dat_i[3:0]] <= 1'b1;
default: ;
endcase
end
end
/thor/trunk/rtl/verilog/Thor_defines.v
121,6 → 121,7
`define ROLI 6'h14
`define RORI 6'h15
`define MODI 8'h5B
`define LEA 8'h5C
`define MODUI 8'h5F
 
`define LLA 8'h6A // compute linear address

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.