Pushing the updated files
diff --git a/verilog/dv/FPU_Half/FPU_Half_tb.v b/verilog/dv/FPU_Half/FPU_Half_tb.v
index 2262050..9a01a9b 100644
--- a/verilog/dv/FPU_Half/FPU_Half_tb.v
+++ b/verilog/dv/FPU_Half/FPU_Half_tb.v
@@ -17,9 +17,9 @@
`timescale 1 ns / 1 ps
-`include "uprj_netlists.v"
-`include "caravel_netlists.v"
-`include "spiflash.v"
+//`include "uprj_netlists.v"
+//`include "caravel_netlists.v"
+//`include "spiflash.v"
`include "tb_prog.v"
module FPU_Half_tb();
@@ -48,7 +48,7 @@
initial begin
$dumpfile("FPU_Half.vcd");
- $dumpvars(0, FPU_Half);
+ $dumpvars(0, FPU_Half_tb);
// Repeat cycles of 1000 clock edges as needed to complete testbench
//repeat (300) begin
diff --git a/verilog/dv/FPU_Half/Makefile b/verilog/dv/FPU_Half/Makefile
index fdf48e7..3fd0b56 100644
--- a/verilog/dv/FPU_Half/Makefile
+++ b/verilog/dv/FPU_Half/Makefile
@@ -14,66 +14,19 @@
#
# SPDX-License-Identifier: Apache-2.0
-## Caravel Pointers
-CARAVEL_ROOT ?= ../../../caravel
-CARAVEL_PATH ?= $(CARAVEL_ROOT)
-CARAVEL_FIRMWARE_PATH = $(CARAVEL_PATH)/verilog/dv/caravel
-CARAVEL_VERILOG_PATH = $(CARAVEL_PATH)/verilog
-CARAVEL_RTL_PATH = $(CARAVEL_VERILOG_PATH)/rtl
-CARAVEL_BEHAVIOURAL_MODELS = $(CARAVEL_VERILOG_PATH)/dv/caravel
-## User Project Pointers
-UPRJ_VERILOG_PATH ?= ../../../verilog
-UPRJ_RTL_PATH = $(UPRJ_VERILOG_PATH)/rtl
-UPRJ_RTL_PATH_FPU = $(UPRJ_VERILOG_PATH)/rtl/FPU/
-UPRJ_BEHAVIOURAL_MODELS = ../
+
+PWDD := $(shell pwd)
+BLOCKS := $(shell basename $(PWDD))
-## RISCV GCC
-#GCC_PATH?=/ef/apps/bin
-GCC_PREFIX?=riscv32-unknown-elf
-#PDK_PATH?=/ef/tech/SW/sky130A
+# ---- Include Partitioned Makefiles ----
-## Simulation mode: RTL/GL
-SIM?=RTL
+CONFIG = caravel_user_project
-.SUFFIXES:
-PATTERN = FPU_Half
+include $(MCW_ROOT)/verilog/dv/make/env.makefile
+include $(MCW_ROOT)/verilog/dv/make/var.makefile
+include $(MCW_ROOT)/verilog/dv/make/cpu.makefile
+include $(MCW_ROOT)/verilog/dv/make/sim.makefile
-all: ${PATTERN:=.vcd}
-hex: ${PATTERN:=.hex}
-
-%.vvp: %_tb.v %.hex
-ifeq ($(SIM),RTL)
- iverilog -DFUNCTIONAL -DSIM -I $(PDK_PATH) \
- -I $(CARAVEL_BEHAVIOURAL_MODELS) -I $(CARAVEL_RTL_PATH) \
- -I $(UPRJ_BEHAVIOURAL_MODELS) -I $(UPRJ_RTL_PATH_FPU) -I $(UPRJ_RTL_PATH) \
- $< -o $@
-else
- iverilog -DFUNCTIONAL -DSIM -DGL -I $(PDK_PATH) \
- -I $(CARAVEL_BEHAVIOURAL_MODELS) -I $(CARAVEL_RTL_PATH) -I $(CARAVEL_VERILOG_PATH) \
- -I $(UPRJ_BEHAVIOURAL_MODELS) -I $(UPRJ_RTL_PATH_FPU) -I$(UPRJ_RTL_PATH) -I $(UPRJ_VERILOG_PATH) \
- $< -o $@
-endif
-
-%.vcd: %.vvp
- vvp $<
-
-%.elf: %.c $(CARAVEL_FIRMWARE_PATH)/sections.lds $(CARAVEL_FIRMWARE_PATH)/start.s
- ${GCC_PATH}/${GCC_PREFIX}-gcc -I $(CARAVEL_PATH) -march=rv32imc -mabi=ilp32 -Wl,-Bstatic,-T,$(CARAVEL_FIRMWARE_PATH)/sections.lds,--strip-debug -ffreestanding -nostdlib -o $@ $(CARAVEL_FIRMWARE_PATH)/start.s $<
-
-%.hex: %.elf
- ${GCC_PATH}/${GCC_PREFIX}-objcopy -O verilog $< $@
- # to fix flash base address
- sed -i 's/@10000000/@00000000/g' $@
-
-%.bin: %.elf
- ${GCC_PATH}/${GCC_PREFIX}-objcopy -O binary $< /dev/stdout | tail -c +1048577 > $@
-
-# ---- Clean ----
-
-clean:
- rm -f *.elf *.hex *.bin *.vvp *.vcd *.log
-
-.PHONY: clean hex all
diff --git a/verilog/dv/FPU_Half/tb_prog.v b/verilog/dv/FPU_Half/tb_prog.v
new file mode 100644
index 0000000..88e1944
--- /dev/null
+++ b/verilog/dv/FPU_Half/tb_prog.v
@@ -0,0 +1,105 @@
+// SPDX-FileCopyrightText: 2020 Efabless Corporation
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+// SPDX-License-Identifier: Apache-2.0
+
+`timescale 1ns / 1ps
+
+module uartprog #(
+ parameter FILENAME="program.hex"
+)(
+ input mprj_ready,
+ output reg r_Rx_Serial // used by task UART_WRITE_BYTE
+);
+
+reg r_Clock = 0;
+parameter c_BIT_PERIOD = 8681; // used by task UART_WRITE_BYTE
+parameter c_CLOCK_PERIOD_NS = 100;
+
+reg [7:0] INSTR [16384-1:0];
+integer instr_count = 0;
+reg ready;
+reg test;
+
+always @ ( posedge r_Clock ) begin
+ if (mprj_ready) begin
+ ready <= 1'b1;
+ end else begin
+ ready <= 1'b0;
+ end
+end
+
+initial begin
+ $readmemh(FILENAME,INSTR);
+end
+
+task UART_WRITE_BYTE;
+ input [7:0] i_Data;
+ integer ii;
+ begin
+ // Send Start Bit
+ r_Rx_Serial <= 1'b0;
+ #(c_BIT_PERIOD);
+ #1000;
+
+ // Send Data Byte
+ for (ii=0; ii<8; ii=ii+1) begin
+ r_Rx_Serial <= i_Data[ii];
+ #(c_BIT_PERIOD);
+ end
+
+ // Send Stop Bit
+ r_Rx_Serial <= 1'b1;
+ #(c_BIT_PERIOD);
+ end
+endtask // UART_WRITE_BYTE
+
+initial begin
+ test = 1'b0;
+ #1000 test = 1'b1;
+end
+
+always
+ #(c_CLOCK_PERIOD_NS/2) r_Clock <= !r_Clock;
+
+initial begin
+ r_Rx_Serial <= 1'b1;
+ #2000;
+ while (!ready && test) begin
+ @(posedge r_Clock)
+ r_Rx_Serial <= 1'b1;
+ end
+ while ((instr_count < 16384) && ({INSTR[instr_count],INSTR[instr_count+1],INSTR[instr_count+2],INSTR[instr_count+3]} != 32'h00000FFF)) begin
+ @(posedge r_Clock);
+ UART_WRITE_BYTE(INSTR[instr_count][7:0]);
+ @(posedge r_Clock);
+ UART_WRITE_BYTE(INSTR[instr_count+1][7:0]);
+ @(posedge r_Clock);
+ UART_WRITE_BYTE(INSTR[instr_count+2][7:0]);
+ @(posedge r_Clock);
+ UART_WRITE_BYTE(INSTR[instr_count+3][7:0]);
+ @(posedge r_Clock);
+ instr_count = instr_count + 32'd4;
+ end
+ @(posedge r_Clock);
+ UART_WRITE_BYTE(8'h00);
+ @(posedge r_Clock);
+ UART_WRITE_BYTE(8'h00);
+ @(posedge r_Clock);
+ UART_WRITE_BYTE(8'h0F);
+ @(posedge r_Clock);
+ UART_WRITE_BYTE(8'hFF);
+ @(posedge r_Clock);
+end
+
+endmodule
diff --git a/verilog/rtl/FPU/Dec_gpr_ctl.v b/verilog/rtl/FPU/Dec_gpr_ctl.v
index 384bde4..ad2c597 100644
--- a/verilog/rtl/FPU/Dec_gpr_ctl.v
+++ b/verilog/rtl/FPU/Dec_gpr_ctl.v
@@ -31,8 +31,9 @@
// GPR Write Enables
assign gpr_wr_en[31:1] = (rst_l == 1'b0) ? {31{1'b1}} : (w0v[31:1]);
+genvar j;
generate
- for (genvar j=1; j<32; j=j+1)
+ for (j=1; j<32; j=j+1)
rvdffe #(32) gprff (.*, .en(gpr_wr_en[j]), .din(gpr_in[j][XLEN-1:0]), .dout(gpr_out[j][XLEN-1:0]));
endgenerate
@@ -42,18 +43,18 @@
assign rd1 = (rst_l == 1'b0) ? {XLEN{1'b0}} : ((rden1 == 1'b1) & (raddr1 != 5'b00000)) ? gpr_out[raddr1][XLEN-1:0] : {XLEN{1'b0}};
// GPR write logic
-integer j;
+integer p;
always @(*) begin
if(rst_l == 1'b0) begin
w0v = 32'h00000000;
- for(j=1; j<32; j=j+1) begin
- gpr_in[j] = {XLEN{1'b0}};
+ for(p=1; p<32; p=p+1) begin
+ gpr_in[p] = {XLEN{1'b0}};
end
end
else begin
- for (int j=1; j<32; j=j+1) begin
- w0v[j] = wen0 & (waddr0[4:0] == j );
- gpr_in[j] = ({XLEN{w0v[j]}} & wd0[XLEN-1:0]);
+ for (p=1; p<32; p=p+1) begin
+ w0v[p] = wen0 & (waddr0[4:0] == p );
+ gpr_in[p] = ({XLEN{w0v[p]}} & wd0[XLEN-1:0]);
end
end
end
diff --git a/verilog/rtl/FPU/FPU_FSM_TOP.v b/verilog/rtl/FPU/FPU_FSM_TOP.v
index 08d4cfa..6c200da 100644
--- a/verilog/rtl/FPU/FPU_FSM_TOP.v
+++ b/verilog/rtl/FPU/FPU_FSM_TOP.v
@@ -1,4 +1,4 @@
-`include "FPU_FSM_Control_Decode.v"
+/*`include "FPU_FSM_Control_Decode.v"
`include "Sky130_SRAM_1kbyte_Memory.v"
`include "uart_rx_prog.v"
`include "iccm_controller.v"
@@ -47,7 +47,7 @@
`include "LZD_main.v"
`include "LZD_mux.v"
`include "LZD_comb.v"
-
+*/
module FPU_FSM_TOP(r_Rx_Serial,clk,rst_l);
@@ -219,4 +219,4 @@
$dumpvars(0);
end
-endmodule
\ No newline at end of file
+endmodule
diff --git a/verilog/rtl/FPU/FPU_exu.v b/verilog/rtl/FPU/FPU_exu.v
index 1e11800..eaa4786 100644
--- a/verilog/rtl/FPU/FPU_exu.v
+++ b/verilog/rtl/FPU/FPU_exu.v
@@ -25,7 +25,7 @@
);
-reg [23:0] sfpu_op_r;
+wire [23:0] sfpu_op_r;
reg sfpu_alu_valid_r;
wire [FPLEN-1:0] fs1_d;
wire [FPLEN-1:0] fs2_d;
diff --git a/verilog/rtl/FPU/FPU_fpr_ctl.v b/verilog/rtl/FPU/FPU_fpr_ctl.v
index 7b1c185..fd0ea3f 100644
--- a/verilog/rtl/FPU/FPU_fpr_ctl.v
+++ b/verilog/rtl/FPU/FPU_fpr_ctl.v
@@ -47,11 +47,11 @@
// FPR Write Enables
assign fpr_wr_en[31:0] = (rst_l == 1'b0) ? {32{1'b1}} : (w0v[31:0]);
-
+
+genvar j;
generate
- for (genvar j=0; j<32; j++) begin : fpr
+ for (j=0; j<32; j=j+1)
rvdffe #(16) fprff (.*, .en(fpr_wr_en[j]), .din(fpr_in[j][FPLEN-1:0]), .dout(fpr_out[j][FPLEN-1:0]));
- end : fpr
endgenerate
@@ -61,18 +61,18 @@
assign rd2 = (rst_l == 1'b0) ? {FPLEN{1'b0}} : ((rden2 == 1'b1)) ? fpr_out[raddr2][FPLEN-1:0] : {FPLEN{1'b0}};
// FPR write logic
-integer j;
+integer q;
always @(*) begin
if(rst_l == 1'b0) begin
w0v = 32'h00000000;
- for(j=0; j<32; j=j+1) begin
- fpr_in[j] = {FPLEN{1'b0}};
+ for(q=0; q<32; q=q+1) begin
+ fpr_in[q] = {FPLEN{1'b0}};
end
end
else begin
- for (int j=0; j<32; j++ ) begin
- w0v[j] = wen0 & (waddr0[4:0] == j );
- fpr_in[j] = ({FPLEN{w0v[j]}} & wd0[FPLEN-1:0]);
+ for (q=0; q<32; q=q+1) begin
+ w0v[q] = wen0 & (waddr0[4:0] == q );
+ fpr_in[q] = ({FPLEN{w0v[q]}} & wd0[FPLEN-1:0]);
end
end
end
diff --git a/verilog/rtl/FPU/Main_Decode.v b/verilog/rtl/FPU/Main_Decode.v
index 4bf7239..99956ec 100644
--- a/verilog/rtl/FPU/Main_Decode.v
+++ b/verilog/rtl/FPU/Main_Decode.v
@@ -17,7 +17,8 @@
wire [2:0] fpu_rnd,Fpu_Frm;
wire [11:0]IMM_ADDI,CSR_Addr;
wire [31:0]IMM_LI;
- reg [4:0]rd,rd_address;
+ reg [4:0]rd;
+ wire [4:0] rd_address;
wire [4:0]rs1,rs2,rs1_address,rs2_address;
//reg [31:0]Instruction_reg;
wire [31:0]gpr_rs1,gpr_rs2;
@@ -148,4 +149,4 @@
assign dec_i0_rs2_en_d = (~rst_l) ? 1'b0 : rs2_en;
assign sfpu_op = (~rst_l) ? 24'b000000 : sfpu_op_w;
-endmodule
\ No newline at end of file
+endmodule