Retimed peripherals for AHB interface

This commit is contained in:
David Harris 2021-02-26 00:55:41 -05:00
parent 4e6caf64d9
commit 24f767a404
8 changed files with 30 additions and 24 deletions

View File

@ -340,7 +340,7 @@ module freg3adr (
generate generate
for (i = 0; i < numRegs; i = i + 1) begin:register for (i = 0; i < numRegs; i = i + 1) begin:register
floprc #(`XLEN) (.clk(clk), .reset(reset), .clear(clear), .d(regInput[i][`XLEN-1:0]), .q(regOutput[i][`XLEN-1:0])); floprc #(`XLEN) reg[i](.clk(clk), .reset(reset), .clear(clear), .d(regInput[i][`XLEN-1:0]), .q(regOutput[i][`XLEN-1:0]));
end end
endgenerate endgenerate

View File

@ -21,7 +21,7 @@ module fcsr(
//for clk-based write //for clk-based write
assign regInput = (write) ? {24'h0,frm,flags} : regInput; assign regInput = (write) ? {24'h0,frm,flags} : regInput;
floprc #(32) (.clk(clk), .reset(reset), .clear(clear), .d(regInput), .q(regOutput)); floprc #(32) fcsrreg(.clk(clk), .reset(reset), .clear(clear), .d(regInput), .q(regOutput));
assign readData = regOutput; assign readData = regOutput;

View File

@ -28,7 +28,7 @@ module freg1adr (
generate generate
for (i = 0; i < numRegs; i = i + 1) begin:register for (i = 0; i < numRegs; i = i + 1) begin:register
floprc #(`XLEN) (.clk(clk), .reset(reset), .clear(clear), .d(regInput[i][`XLEN-1:0]), .q(regOutput[i][`XLEN-1:0])); floprc #(`XLEN) freg[i](.clk(clk), .reset(reset), .clear(clear), .d(regInput[i][`XLEN-1:0]), .q(regOutput[i][`XLEN-1:0]));
end end
endgenerate endgenerate
@ -167,7 +167,7 @@ module freg2adr (
generate generate
for (i = 0; i < numRegs; i = i + 1) begin:register for (i = 0; i < numRegs; i = i + 1) begin:register
floprc #(`XLEN) (.clk(clk), .reset(reset), .clear(clear), .d(regInput[i][`XLEN-1:0]), .q(regOutput[i][`XLEN-1:0])); floprc #(`XLEN) freg[i](.clk(clk), .reset(reset), .clear(clear), .d(regInput[i][`XLEN-1:0]), .q(regOutput[i][`XLEN-1:0]));
end end
endgenerate endgenerate
@ -340,7 +340,7 @@ module freg3adr (
generate generate
for (i = 0; i < numRegs; i = i + 1) begin:register for (i = 0; i < numRegs; i = i + 1) begin:register
floprc #(`XLEN) (.clk(clk), .reset(reset), .clear(clear), .d(regInput[i][`XLEN-1:0]), .q(regOutput[i][`XLEN-1:0])); floprc #(`XLEN) freg[i](.clk(clk), .reset(reset), .clear(clear), .d(regInput[i][`XLEN-1:0]), .q(regOutput[i][`XLEN-1:0]));
end end
endgenerate endgenerate

View File

@ -44,7 +44,9 @@ module clint (
assign memread = MemRWclint[1]; assign memread = MemRWclint[1];
assign memwrite = MemRWclint[0]; assign memwrite = MemRWclint[0];
assign HRESPCLINT = 0; // OK assign HRESPCLINT = 0; // OK
assign HREADYCLINT = 1; // Respond immediately // assign HREADYCLINT = 1; // Respond immediately
always_ff @(posedge HCLK) // delay response
HREADYCLINT <= memread | memwrite;
// word aligned reads // word aligned reads
generate generate
@ -63,7 +65,7 @@ module clint (
// register access // register access
generate generate
if (`XLEN==64) begin if (`XLEN==64) begin
always_comb begin always @(posedge HCLK) begin
case(entry) case(entry)
16'h0000: HREADCLINT = {63'b0, MSIP}; 16'h0000: HREADCLINT = {63'b0, MSIP};
16'h4000: HREADCLINT = MTIMECMP; 16'h4000: HREADCLINT = MTIMECMP;
@ -85,7 +87,7 @@ module clint (
else MTIME <= MTIME + 1; else MTIME <= MTIME + 1;
end end
end else begin // 32-bit end else begin // 32-bit
always_comb begin always @(posedge HCLK) begin
case(entry) case(entry)
16'h0000: HREADCLINT = {31'b0, MSIP}; 16'h0000: HREADCLINT = {31'b0, MSIP};
16'h4000: HREADCLINT = MTIMECMP[31:0]; 16'h4000: HREADCLINT = MTIMECMP[31:0];

View File

@ -45,7 +45,9 @@ module gpio (
assign memread = MemRWgpio[1]; assign memread = MemRWgpio[1];
assign memwrite = MemRWgpio[0]; assign memwrite = MemRWgpio[0];
assign HRESPGPIO = 0; // OK assign HRESPGPIO = 0; // OK
assign HREADYGPIO = 1; // Respond immediately always_ff @(posedge HCLK) // delay response to data cycle
HREADYGPIO <= memread | memwrite;
// assign HREADYGPIO = 1; // Respond immediately
// word aligned reads // word aligned reads
generate generate
@ -67,12 +69,12 @@ module gpio (
// register access // register access
generate generate
if (`XLEN==64) begin if (`XLEN==64) begin
always_comb begin always_ff @(posedge HCLK) begin
case(entry) case(entry)
8'h00: HREADGPIO = {INPUT_EN, INPUT_VAL}; 8'h00: HREADGPIO <= {INPUT_EN, INPUT_VAL};
8'h08: HREADGPIO = {OUTPUT_VAL, OUTPUT_EN}; 8'h08: HREADGPIO <= {OUTPUT_VAL, OUTPUT_EN};
8'h40: HREADGPIO = 0; // OUT_XOR reads as 0 8'h40: HREADGPIO <= 0; // OUT_XOR reads as 0
default: HREADGPIO = 0; default: HREADGPIO <= 0;
endcase endcase
end end
always_ff @(posedge HCLK or negedge HRESETn) always_ff @(posedge HCLK or negedge HRESETn)
@ -86,14 +88,14 @@ module gpio (
if (entry == 8'h40) OUTPUT_VAL <= OUTPUT_VAL ^ HWDATA[31:0]; // OUT_XOR if (entry == 8'h40) OUTPUT_VAL <= OUTPUT_VAL ^ HWDATA[31:0]; // OUT_XOR
end end
end else begin // 32-bit end else begin // 32-bit
always_comb begin always_ff @(posedge HCLK) begin
case(entry) case(entry)
8'h00: HREADGPIO = INPUT_VAL; 8'h00: HREADGPIO <= INPUT_VAL;
8'h04: HREADGPIO = INPUT_EN; 8'h04: HREADGPIO <= INPUT_EN;
8'h08: HREADGPIO = OUTPUT_EN; 8'h08: HREADGPIO <= OUTPUT_EN;
8'h0C: HREADGPIO = OUTPUT_VAL; 8'h0C: HREADGPIO <= OUTPUT_VAL;
8'h40: HREADGPIO = 0; // OUT_XOR reads as 0 8'h40: HREADGPIO <= 0; // OUT_XOR reads as 0
default: HREADGPIO = 0; default: HREADGPIO <= 0;
endcase endcase
end end
always_ff @(posedge HCLK or negedge HRESETn) always_ff @(posedge HCLK or negedge HRESETn)

View File

@ -48,11 +48,13 @@ module uart (
assign MEMWb = ~MemRWuart[0]; assign MEMWb = ~MemRWuart[0];
assign A = HADDR[2:0]; assign A = HADDR[2:0];
assign HRESPUART = 0; // OK assign HRESPUART = 0; // OK
assign HREADYUART = 1; // Respond immediately //assign HREADYUART = 1; // Respond immediately
always_ff @(posedge HCLK) // delay response to data cycle
HREADYUART <= ~MEMRb | ~MEMWb;
generate generate
if (`XLEN == 64) begin if (`XLEN == 64) begin
always_comb begin always @(posedge HCLK) begin
HREADUART = {Dout, Dout, Dout, Dout, Dout, Dout, Dout, Dout}; HREADUART = {Dout, Dout, Dout, Dout, Dout, Dout, Dout, Dout};
case (HADDR) case (HADDR)
3'b000: Din = HWDATA[7:0]; 3'b000: Din = HWDATA[7:0];
@ -66,7 +68,7 @@ module uart (
endcase endcase
end end
end else begin // 32-bit end else begin // 32-bit
always_comb begin always @(posedge HCLK) begin
HREADUART = {Dout, Dout, Dout, Dout}; HREADUART = {Dout, Dout, Dout, Dout};
case (HADDR[1:0]) case (HADDR[1:0])
2'b00: Din = HWDATA[7:0]; 2'b00: Din = HWDATA[7:0];