From a6a907e0256d7b51cd3e3a3091f6aa88e7244b68 Mon Sep 17 00:00:00 2001 From: bluew Date: Thu, 11 Apr 2019 21:43:33 +0200 Subject: [PATCH 01/24] Enable wlf dumping with +wlfdump --- tb/dm/tb_top.sv | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tb/dm/tb_top.sv b/tb/dm/tb_top.sv index 409c36e..1b5941c 100644 --- a/tb/dm/tb_top.sv +++ b/tb/dm/tb_top.sv @@ -53,6 +53,9 @@ module tb_top $dumpfile("riscy_tb.vcd"); $dumpvars(0, tb_top); end + if ($test$plusargs("wlfdump")) begin + $wlfdumpvars(0, tb_top); + end end // we either load the provided firmware or execute a small test program that From ff9df77b4d289f2095da53258d24925613c9c230 Mon Sep 17 00:00:00 2001 From: Pasquale Davide Schiavone Date: Thu, 11 Apr 2019 12:44:03 +0200 Subject: [PATCH 02/24] :bug: fix clk en when dbg_req is high --> wfi never woke up --- rtl/riscv_core.sv | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rtl/riscv_core.sv b/rtl/riscv_core.sv index afec7f5..eb7d3d8 100644 --- a/rtl/riscv_core.sv +++ b/rtl/riscv_core.sv @@ -414,7 +414,7 @@ module riscv_core // interface to finish loading instructions assign core_busy_int = (PULP_CLUSTER & data_load_event_ex & data_req_o) ? (if_busy | apu_busy) : (if_busy | ctrl_busy | lsu_busy | apu_busy); - assign clock_en = PULP_CLUSTER ? clock_en_i | core_busy_o : irq_i | core_busy_o; + assign clock_en = PULP_CLUSTER ? clock_en_i | core_busy_o : irq_i | debug_req_i | core_busy_o; assign sleeping = ~core_busy_o; From 4212dc7bccabab420087a53c5d32ca0f479814b3 Mon Sep 17 00:00:00 2001 From: bluew Date: Thu, 11 Apr 2019 21:44:40 +0200 Subject: [PATCH 03/24] Add Jenkinsfile and junit post proc script for riscv-compliance --- ci/Jenkinsfile | 51 +++++++++++++++++++++++++++++++++++ ci/dummy.csh | 3 --- ci/rv32tests-to-junit.py | 58 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 109 insertions(+), 3 deletions(-) create mode 100644 ci/Jenkinsfile delete mode 100755 ci/dummy.csh create mode 100755 ci/rv32tests-to-junit.py diff --git a/ci/Jenkinsfile b/ci/Jenkinsfile new file mode 100644 index 0000000..b27ec0e --- /dev/null +++ b/ci/Jenkinsfile @@ -0,0 +1,51 @@ +node ('centos7' + ' && !vm1-centos7'){ + try { + stage('Preparation') { + withEnv(['PATH+WHATEVER=/home/balasr/.local/bin:/home/balasr/.riscv/bin']) { + checkout scm + sh 'pip install --user junit-xml' + sh 'git submodule update --init --recursive' + dir("tb/core") { + sh 'make fpnew/src/fpnew_pkg.sv' + } + } + } + stage('Build Firmware') { + withEnv(['PATH+WHATEVER=/home/balasr/.local/bin:/home/balasr/.riscv/bin', + 'RISCV=/home/balasr/.riscv']) { + dir("tb/core") { + sh "make firmware/firmware.hex" + } + } + } + stage('Build RTL') { + dir("tb/core") { + sh "make vsim-all" + } + } + + stage('Test riscv-tests and riscv-compliance') { + dir("tb/core"){ + sh "make firmware-vsim-run 2>&1 | tee test.log" + } + sh "./ci/rv32tests-to-junit.py -i tb/core/test.log -o test_report.xml" + } + + } catch (e) { + currentBuild.result = "FAILED" + echo "SENDING E-MAIL" + notifyFailed() + throw e + } finally { + junit '*.xml' + } +} + +def notifyFailed() { + emailext ( + subject: "FAILED: Job '${env.JOB_NAME} [${env.BUILD_NUMBER}]'", + body: """

FAILED: Job '${env.JOB_NAME} [${env.BUILD_NUMBER}]':

+

Check console output at "${env.JOB_NAME} [${env.BUILD_NUMBER}]"

""", + recipientProviders: [[$class: 'DevelopersRecipientProvider']] + ) +} diff --git a/ci/dummy.csh b/ci/dummy.csh deleted file mode 100755 index bafa6a9..0000000 --- a/ci/dummy.csh +++ /dev/null @@ -1,3 +0,0 @@ -#!/bin/tcsh - -echo "New commit triggers PULPino CI" diff --git a/ci/rv32tests-to-junit.py b/ci/rv32tests-to-junit.py new file mode 100755 index 0000000..94349b2 --- /dev/null +++ b/ci/rv32tests-to-junit.py @@ -0,0 +1,58 @@ +#!/usr/bin/env python3 +import sys, getopt +from junit_xml import * + + +def main(argv): + inputfile = '' + outputfile = '' + + try: + opts, args = getopt.getopt(argv,"hi:o:",["ifile=","ofile="]) + except getopt.GetoptError: + print ('rv32tests-to-junit.py -i -o ') + sys.exit(2) + for opt, arg in opts: + if opt == '-h': + print ('rv32tests-to-junit.py -i -o ') + sys.exit() + elif opt in ("-i", "--ifile"): + inputfile = arg + elif opt in ("-o", "--ofile"): + outputfile = arg + + test_strings = defaultdict(list) + current_testname = '' + + test_cases = [] + current_test_case = None + + with open(inputfile, 'r') as infile: + for line in infile: + if 'Test Begin' in line: + current_testname = line.split('#')[1] + if 'Test End' in line: + current_testname = "" + if current_testname != "": + test_strings[current_testname].append(line) + + for k,v in test_strings.items(): + #test_cases.append(TestCase('Test1', stdout=''.join(v))) + current_test_case = TestCase(k, stdout=''.join(v)) + error_msg = "" + for line in v: + if 'Assertion violation' in line: + error_msg += line; + + if error_msg: + current_test_case.add_error_info(error_msg) + + test_cases.append(current_test_case) + + ts = TestSuite("riscv-compliance", test_cases) + # pretty printing is on by default but can be disabled using prettyprint=False + with open(outputfile, 'w') as outfile: + TestSuite.to_file(outfile, [ts]) + +if __name__ == "__main__": + main(sys.argv[1:]) From 491acfe57bc9eac6049cd087234a318705dfa67e Mon Sep 17 00:00:00 2001 From: bluew Date: Thu, 11 Apr 2019 21:44:03 +0200 Subject: [PATCH 04/24] Fix single stepping over illegal instructions --- rtl/riscv_controller.sv | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/rtl/riscv_controller.sv b/rtl/riscv_controller.sv index 011ba80..cebdbc7 100644 --- a/rtl/riscv_controller.sv +++ b/rtl/riscv_controller.sv @@ -545,8 +545,10 @@ module riscv_controller // prevent any more instructions from executing halt_if_o = 1'b1; + if (illegal_insn_i) begin + ctrl_fsm_ns = DBG_FLUSH; + end else if (id_ready_i) begin // make sure the current instruction has been executed - if (id_ready_i) begin unique case(1'b1) branch_in_id: ctrl_fsm_ns = DBG_WAIT_BRANCH; @@ -794,9 +796,16 @@ module riscv_controller end - if(~pipe_flush_i) begin + if (debug_single_step_i & ~debug_mode_q) begin + // this is the path for instructions to the debug mode that need + // FLUSH_WB e.g. illegal_insn_i. The already fetched instruction will + // be the address we set the dpc to, therefore we got to DBG_TAKEN_IF. + ctrl_fsm_ns = DBG_TAKEN_IF; + end else if(~pipe_flush_i) begin + // regular instruction ctrl_fsm_ns = DECODE; - end else begin + end else begin //pipe_flush_i + // we have a wfi, after the flush we got to sleep ctrl_fsm_ns = WAIT_SLEEP; end @@ -886,7 +895,12 @@ module riscv_controller end //data error else begin - if(debug_mode_q) begin //ebreak in debug rom + if(illegal_insn_i) begin + //check done to prevent data harzard in the CSR registers + if (ex_valid_i) + ctrl_fsm_ns = FLUSH_WB; + + end else if(debug_mode_q) begin //ebreak in debug rom ctrl_fsm_ns = DBG_TAKEN_ID; end else if(data_load_event_i) begin ctrl_fsm_ns = DBG_TAKEN_ID; From 5e5dc30645c08807101f26ead0a2aa99f2b2936f Mon Sep 17 00:00:00 2001 From: bluew Date: Thu, 11 Apr 2019 21:44:40 +0200 Subject: [PATCH 05/24] Add Jenkinsfile and junit post proc script for riscv-compliance --- ci/Jenkinsfile | 51 +++++++++++++++++++++++++++++++++++ ci/dummy.csh | 3 --- ci/rv32tests-to-junit.py | 58 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 109 insertions(+), 3 deletions(-) create mode 100644 ci/Jenkinsfile delete mode 100755 ci/dummy.csh create mode 100755 ci/rv32tests-to-junit.py diff --git a/ci/Jenkinsfile b/ci/Jenkinsfile new file mode 100644 index 0000000..b27ec0e --- /dev/null +++ b/ci/Jenkinsfile @@ -0,0 +1,51 @@ +node ('centos7' + ' && !vm1-centos7'){ + try { + stage('Preparation') { + withEnv(['PATH+WHATEVER=/home/balasr/.local/bin:/home/balasr/.riscv/bin']) { + checkout scm + sh 'pip install --user junit-xml' + sh 'git submodule update --init --recursive' + dir("tb/core") { + sh 'make fpnew/src/fpnew_pkg.sv' + } + } + } + stage('Build Firmware') { + withEnv(['PATH+WHATEVER=/home/balasr/.local/bin:/home/balasr/.riscv/bin', + 'RISCV=/home/balasr/.riscv']) { + dir("tb/core") { + sh "make firmware/firmware.hex" + } + } + } + stage('Build RTL') { + dir("tb/core") { + sh "make vsim-all" + } + } + + stage('Test riscv-tests and riscv-compliance') { + dir("tb/core"){ + sh "make firmware-vsim-run 2>&1 | tee test.log" + } + sh "./ci/rv32tests-to-junit.py -i tb/core/test.log -o test_report.xml" + } + + } catch (e) { + currentBuild.result = "FAILED" + echo "SENDING E-MAIL" + notifyFailed() + throw e + } finally { + junit '*.xml' + } +} + +def notifyFailed() { + emailext ( + subject: "FAILED: Job '${env.JOB_NAME} [${env.BUILD_NUMBER}]'", + body: """

FAILED: Job '${env.JOB_NAME} [${env.BUILD_NUMBER}]':

+

Check console output at "${env.JOB_NAME} [${env.BUILD_NUMBER}]"

""", + recipientProviders: [[$class: 'DevelopersRecipientProvider']] + ) +} diff --git a/ci/dummy.csh b/ci/dummy.csh deleted file mode 100755 index bafa6a9..0000000 --- a/ci/dummy.csh +++ /dev/null @@ -1,3 +0,0 @@ -#!/bin/tcsh - -echo "New commit triggers PULPino CI" diff --git a/ci/rv32tests-to-junit.py b/ci/rv32tests-to-junit.py new file mode 100755 index 0000000..94349b2 --- /dev/null +++ b/ci/rv32tests-to-junit.py @@ -0,0 +1,58 @@ +#!/usr/bin/env python3 +import sys, getopt +from junit_xml import * + + +def main(argv): + inputfile = '' + outputfile = '' + + try: + opts, args = getopt.getopt(argv,"hi:o:",["ifile=","ofile="]) + except getopt.GetoptError: + print ('rv32tests-to-junit.py -i -o ') + sys.exit(2) + for opt, arg in opts: + if opt == '-h': + print ('rv32tests-to-junit.py -i -o ') + sys.exit() + elif opt in ("-i", "--ifile"): + inputfile = arg + elif opt in ("-o", "--ofile"): + outputfile = arg + + test_strings = defaultdict(list) + current_testname = '' + + test_cases = [] + current_test_case = None + + with open(inputfile, 'r') as infile: + for line in infile: + if 'Test Begin' in line: + current_testname = line.split('#')[1] + if 'Test End' in line: + current_testname = "" + if current_testname != "": + test_strings[current_testname].append(line) + + for k,v in test_strings.items(): + #test_cases.append(TestCase('Test1', stdout=''.join(v))) + current_test_case = TestCase(k, stdout=''.join(v)) + error_msg = "" + for line in v: + if 'Assertion violation' in line: + error_msg += line; + + if error_msg: + current_test_case.add_error_info(error_msg) + + test_cases.append(current_test_case) + + ts = TestSuite("riscv-compliance", test_cases) + # pretty printing is on by default but can be disabled using prettyprint=False + with open(outputfile, 'w') as outfile: + TestSuite.to_file(outfile, [ts]) + +if __name__ == "__main__": + main(sys.argv[1:]) From b1f91908117a785ef2cc9be9ce532fe66ea4ab38 Mon Sep 17 00:00:00 2001 From: bluew Date: Fri, 12 Apr 2019 16:43:05 +0200 Subject: [PATCH 06/24] Exit simulation when jtag end (openocd) signals quit --- tb/dm/remote_bitbang/remote_bitbang.c | 1 - tb/dm/tb_test_env.sv | 4 ++++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/tb/dm/remote_bitbang/remote_bitbang.c b/tb/dm/remote_bitbang/remote_bitbang.c index f4e790f..e77c00d 100644 --- a/tb/dm/remote_bitbang/remote_bitbang.c +++ b/tb/dm/remote_bitbang/remote_bitbang.c @@ -258,7 +258,6 @@ void rbs_execute_command() } if (quit) { - // The remote disconnected. fprintf(stderr, "Remote end disconnected\n"); close(client_fd); client_fd = 0; diff --git a/tb/dm/tb_test_env.sv b/tb/dm/tb_test_env.sv index fe1676f..ce869a5 100644 --- a/tb/dm/tb_test_env.sv +++ b/tb/dm/tb_test_env.sv @@ -317,5 +317,9 @@ module tb_test_env .jtag_TDO_driven ( 1'b1 ), .exit ( sim_jtag_exit )); + always_comb begin : jtag_exit_handler + if (sim_jtag_exit) + $finish(2); // print stats too + end endmodule // tb_test_env From eea2274e3ee7f41eb5e07a55d7c0062ceaaa1f27 Mon Sep 17 00:00:00 2001 From: bluew Date: Fri, 12 Apr 2019 16:57:46 +0200 Subject: [PATCH 07/24] Fix openocd ci script to use coproc to block --- ci/run-openocd-compliance.sh | 46 +++++++++++++++++++++++------------- 1 file changed, 30 insertions(+), 16 deletions(-) diff --git a/ci/run-openocd-compliance.sh b/ci/run-openocd-compliance.sh index df3fb5f..6d0c713 100755 --- a/ci/run-openocd-compliance.sh +++ b/ci/run-openocd-compliance.sh @@ -4,30 +4,44 @@ set -e ROOT=$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd) -vsim_out=$(mktemp) -openocd_out=$(mktemp) +if [ -z "${RISCV}" ] +then + echo "RISCV is empty" + exit 1 +fi -function clean_up { - rm ${vsim_out} - rm ${openocd_out} - kill 0 +function cleanup { + echo "cleaning up processes and tmp files" + sleep 2 + echo "vsim pid is:${vsim_pid} pgid:${vsim_pgid}" + if ps -p "${vsim_pid}" > /dev/null + then + echo "vsim pid exists, killing it" + kill -- -"${vsim_pgid}" + fi + rm "${vsim_out}" } -# kill all children if this script exits -trap "exit" INT TERM -trap clean_up EXIT +trap cleanup EXIT + +vsim_out=$(mktemp) +openocd_out=openocd.log -make -C ${ROOT}/tb/dm clean -make -C ${ROOT}/tb/dm tb-all -make -C ${ROOT}/tb/dm prog/test.hex -make -C ${ROOT}/tb/dm prog-run &> ${vsim_out}& +make -C "${ROOT}"/tb/dm vsim-run &> "${vsim_out}"& +# record vsim pid/pgid to kill it if it survives this script +vsim_pid=$! +vsim_pgid=$(ps -o pgid= ${vsim_pid} | grep -o [0-9]*) -( tail -f -n0 ${vsim_out} & ) | grep -m 1 "Listening on port" +# block until we get "Listening on port" so that we are safe to connect openocd +coproc grep -m 1 "Listening on port" +tail -f -n0 "${vsim_out}" --pid "$COPROC_PID" >&"${COPROC[1]}" echo "Starting openocd" -${RISCV}/bin/openocd -f ${ROOT}/tb/dm/pulpissimo_compliance_test.cfg |& tee ${openocd_out} +"${RISCV}"/bin/openocd -f "${ROOT}"/tb/dm/pulpissimo_compliance_test.cfg |& tee "${openocd_out}" + -if grep -q "ALL TESTS PASSED" ${openocd_out}; then +if grep -q "ALL TESTS PASSED" "${openocd_out}"; then exit 0 fi exit 1 + From 5ea7bf0e622c47c3752b04e367ac5e17b6f53ec6 Mon Sep 17 00:00:00 2001 From: bluew Date: Fri, 12 Apr 2019 19:09:21 +0200 Subject: [PATCH 08/24] Update Jenkinsfile to run openocd compliance tests --- ci/Jenkinsfile | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/ci/Jenkinsfile b/ci/Jenkinsfile index b27ec0e..4771688 100644 --- a/ci/Jenkinsfile +++ b/ci/Jenkinsfile @@ -16,19 +16,32 @@ node ('centos7' + ' && !vm1-centos7'){ dir("tb/core") { sh "make firmware/firmware.hex" } + dir("tb/dm") { + sh "make prog/test.hex" + } } } stage('Build RTL') { dir("tb/core") { sh "make vsim-all" } + dir("tb/dm") { + sh "make vsim-all" + } } - stage('Test riscv-tests and riscv-compliance') { - dir("tb/core"){ + stage('Run Tests') { + dir("tb/core") { sh "make firmware-vsim-run 2>&1 | tee test.log" } - sh "./ci/rv32tests-to-junit.py -i tb/core/test.log -o test_report.xml" + sh "./ci/rv32tests-to-junit.py -i tb/core/test.log -o rv32_test_report.xml" + + withEnv(['PATH+WHATEVER=/home/balasr/.local/bin:/home/balasr/.riscv/bin', + 'RISCV=/home/balasr/.riscv']) { + sh "./ci/run-openocd-compliance.sh" + sh "./ci/openocd-to-junit.py -i ci/openocd.log -o openocd_test_report.xml" + + } } } catch (e) { From 59f5290131179a70301cc9ac83d5d1b9994ea382 Mon Sep 17 00:00:00 2001 From: bluew Date: Fri, 12 Apr 2019 19:13:36 +0200 Subject: [PATCH 09/24] Add script to convert openocd-compliance test results to junit xml --- ci/Jenkinsfile | 2 +- ci/openocd-to-junit.py | 62 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 63 insertions(+), 1 deletion(-) create mode 100755 ci/openocd-to-junit.py diff --git a/ci/Jenkinsfile b/ci/Jenkinsfile index 4771688..0833865 100644 --- a/ci/Jenkinsfile +++ b/ci/Jenkinsfile @@ -39,7 +39,7 @@ node ('centos7' + ' && !vm1-centos7'){ withEnv(['PATH+WHATEVER=/home/balasr/.local/bin:/home/balasr/.riscv/bin', 'RISCV=/home/balasr/.riscv']) { sh "./ci/run-openocd-compliance.sh" - sh "./ci/openocd-to-junit.py -i ci/openocd.log -o openocd_test_report.xml" + sh "./ci/openocd-to-junit.py -i openocd.log -o openocd_test_report.xml" } } diff --git a/ci/openocd-to-junit.py b/ci/openocd-to-junit.py new file mode 100755 index 0000000..392fb74 --- /dev/null +++ b/ci/openocd-to-junit.py @@ -0,0 +1,62 @@ +#!/usr/bin/env python3 +import sys, getopt +from junit_xml import * + + +def main(argv): + inputfile = '' + outputfile = '' + + try: + opts, args = getopt.getopt(argv,"hi:o:",["ifile=","ofile="]) + except getopt.GetoptError: + print ('openocd-to-junit.py -i -o ') + sys.exit(2) + for opt, arg in opts: + if opt == '-h': + print ('openocd-to-junit.py -i -o ') + sys.exit() + elif opt in ("-i", "--ifile"): + inputfile = arg + elif opt in ("-o", "--ofile"): + outputfile = arg + + test_strings = defaultdict(list) + test_timestamps = {} + current_testname = '' + + test_cases = [] + current_test_case = None + + ocd_stdout = '' + + with open(inputfile, 'r') as infile: + for line in infile: + if 'Info' in line and 'riscv013_test_compliance()' in line: + print(line.split(' ')) + current_testname = ' '.join(line.split(' ')[7:]) + test_strings[current_testname].append(line) + test_timestamps[current_testname] = line.split(' ')[3] + + ocd_stdout += line + + for k,v in test_strings.items(): + current_test_case = TestCase(k, stdout=''.join(v), + timestamp=test_timestamps[k]) + error_msg = "" + for line in v: + if 'FAILED' in line: + error_msg += line; + + if error_msg: + current_test_case.add_error_info(error_msg) + + test_cases.append(current_test_case) + + ts = TestSuite("openocd-compliance", test_cases, stdout=ocd_stdout) + # pretty printing is on by default but can be disabled using prettyprint=False + with open(outputfile, 'w') as outfile: + TestSuite.to_file(outfile, [ts]) + +if __name__ == "__main__": + main(sys.argv[1:]) From eb446910035940c3f338218d114f688162376202 Mon Sep 17 00:00:00 2001 From: bluew Date: Mon, 15 Apr 2019 16:58:32 +0200 Subject: [PATCH 10/24] Remove references to old debug unit --- Bender.yml | 1 - rtl/riscv_debug_unit.sv | 562 --------------------------------------- src_files.yml | 3 +- verilator-model/Makefile | 1 - 4 files changed, 1 insertion(+), 566 deletions(-) delete mode 100644 rtl/riscv_debug_unit.sv diff --git a/Bender.yml b/Bender.yml index d4e042b..ebebe20 100644 --- a/Bender.yml +++ b/Bender.yml @@ -17,7 +17,6 @@ sources: - rtl/riscv_compressed_decoder.sv - rtl/riscv_controller.sv - rtl/riscv_cs_registers.sv - - rtl/riscv_debug_unit.sv - rtl/riscv_decoder.sv - rtl/riscv_int_controller.sv - rtl/riscv_ex_stage.sv diff --git a/rtl/riscv_debug_unit.sv b/rtl/riscv_debug_unit.sv deleted file mode 100644 index cc72a7e..0000000 --- a/rtl/riscv_debug_unit.sv +++ /dev/null @@ -1,562 +0,0 @@ -// Copyright 2018 ETH Zurich and University of Bologna. -// Copyright and related rights are licensed under the Solderpad Hardware -// License, Version 0.51 (the "License"); you may not use this file except in -// compliance with the License. You may obtain a copy of the License at -// http://solderpad.org/licenses/SHL-0.51. Unless required by applicable law -// or agreed to in writing, software, hardware and materials distributed under -// this 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. - -//////////////////////////////////////////////////////////////////////////////// -// Engineer: Andreas Traber - atraber@iis.ee.ethz.ch // -// // -// Design Name: Debug Unit // -// Project Name: RI5CY // -// Language: SystemVerilog // -// // -// Description: Debug controller // -// // -//////////////////////////////////////////////////////////////////////////////// - - -import riscv_defines::*; - -module riscv_debug_unit -( - input logic clk, - input logic rst_n, - - // Debug Interface - input logic debug_req_i, - output logic debug_gnt_o, - output logic debug_rvalid_o, - input logic [14:0] debug_addr_i, - input logic debug_we_i, - input logic [31:0] debug_wdata_i, - output logic [31:0] debug_rdata_o, - - output logic debug_halted_o, - input logic debug_halt_i, - input logic debug_resume_i, - - // signals to core - output logic [DBG_SETS_W-1:0] settings_o, - - input logic trap_i, // trap found, need to stop the core now - input logic [5:0] exc_cause_i, // if it was a trap, then the exception controller knows more - output logic stall_o, // after we got control, we control the stall signal - output logic dbg_req_o, - input logic dbg_ack_i, - - // register file read port - output logic regfile_rreq_o, - output logic [ 5:0] regfile_raddr_o, - input logic [31:0] regfile_rdata_i, - - // register file write port - output logic regfile_wreq_o, - output logic [ 5:0] regfile_waddr_o, - output logic [31:0] regfile_wdata_o, - - // CSR read/write port - output logic csr_req_o, - output logic [11:0] csr_addr_o, - output logic csr_we_o, - output logic [31:0] csr_wdata_o, - input logic [31:0] csr_rdata_i, - - // Signals for PPC & NPC register - input logic [31:0] pc_if_i, - input logic [31:0] pc_id_i, - input logic [31:0] pc_ex_i, - - input logic data_load_event_i, - input logic instr_valid_id_i, - - input logic sleeping_i, - - input logic branch_in_ex_i, - input logic branch_taken_i, - - output logic jump_req_o, - output logic [31:0] jump_addr_o -); - - enum logic [2:0] {RD_NONE, RD_CSR, RD_GPR, RD_DBGA, RD_DBGS} rdata_sel_q, rdata_sel_n; - - enum logic [0:0] {FIRST, SECOND} state_q, state_n; - - logic [DBG_SETS_W-1:0] settings_q, settings_n; - - // for timing critical register file access we need to keep those in FFs - logic [14:0] addr_q; - logic [31:0] wdata_q; // mainly for jumps - logic regfile_rreq_q, regfile_rreq_n; - logic regfile_fp_sel_q, regfile_fp_sel_n; - logic jump_req_q, jump_req_n; - - // not timing critical - logic csr_req_q, csr_req_n; - logic regfile_wreq; - logic regfile_fp_wr; - - - enum logic [1:0] {RUNNING, HALT_REQ, HALT} stall_cs, stall_ns; - logic [31:0] dbg_rdata; - logic dbg_resume; - logic dbg_halt; - logic [5:0] dbg_cause_q, dbg_cause_n; - logic dbg_ssth_q, dbg_ssth_n; - - logic ssth_clear; - - - // ppc/npc tracking - enum logic [1:0] {IFID, IFEX, IDEX} pc_tracking_fsm_cs, pc_tracking_fsm_ns; - logic [31:0] ppc_int, npc_int; - - - // address decoding, write and read controller - always_comb - begin - rdata_sel_n = RD_NONE; - state_n = FIRST; - - debug_gnt_o = 1'b0; - - regfile_rreq_n = 1'b0; - regfile_wreq = 1'b0; - csr_req_n = 1'b0; - csr_we_o = 1'b0; - jump_req_n = 1'b0; - - dbg_resume = 1'b0; - dbg_halt = 1'b0; - settings_n = settings_q; - - ssth_clear = 1'b0; - - regfile_fp_sel_n = 1'b0; - regfile_fp_wr = 1'b0; - - if (debug_req_i) begin - if (debug_we_i) begin - //---------------------------------------------------------------------------- - // write access - //---------------------------------------------------------------------------- - if (debug_addr_i[14]) begin - // CSR access - if (state_q == FIRST) begin - // only grant in second cycle, address and data have been latched by then - debug_gnt_o = 1'b0; - state_n = SECOND; - - if (debug_halted_o) begin - // access to internal registers are only allowed when the core is halted - csr_req_n = 1'b1; - end - end else begin - debug_gnt_o = 1'b1; // grant it even when invalid access to not block - state_n = FIRST; - csr_we_o = 1'b1; - end - end else begin - // non-CSR access - unique case (debug_addr_i[13:8]) - 6'b00_0000: begin // Debug Registers, always accessible - debug_gnt_o = 1'b1; - - unique case (debug_addr_i[6:2]) - 5'b0_0000: begin // DBG_CTRL - if (debug_wdata_i[16]) begin - // HALT set - if (~debug_halted_o) begin - // not halt, so STOP - dbg_halt = 1'b1; - end - end else begin - // RESUME set - if (debug_halted_o) begin - dbg_resume = 1'b1; - end - end - - settings_n[DBG_SETS_SSTE] = debug_wdata_i[0]; - end - 5'b0_0001: begin // DBG_HIT - ssth_clear = debug_wdata_i[0]; - end - 5'b0_0010: begin // DBG_IE - settings_n[DBG_SETS_ECALL] = debug_wdata_i[11]; - settings_n[DBG_SETS_ELSU] = debug_wdata_i[7] | debug_wdata_i[5]; - settings_n[DBG_SETS_EBRK] = debug_wdata_i[3]; - settings_n[DBG_SETS_EILL] = debug_wdata_i[2]; - end - default:; - endcase - end - - 6'b10_0000: begin // Debug Registers, only accessible when in debug - debug_gnt_o = 1'b1; // grant it even when invalid access to not block - - if (debug_halted_o) begin - unique case (debug_addr_i[6:2]) - 5'b0_0000: jump_req_n = 1'b1; // DNPC - default:; - endcase - end - end - - 6'b00_0100: begin // General-Purpose Registers - debug_gnt_o = 1'b1; // grant it even when invalid access to not block - - if (debug_halted_o) begin - regfile_wreq = 1'b1; - end - end - - 6'b00_0101: begin // General-Purpose Floating-Point Registers - debug_gnt_o = 1'b1; // grant it even when invalid access to not block - - if (debug_halted_o) begin - regfile_wreq = 1'b1; - regfile_fp_wr = 1'b1; - end - end - - default: debug_gnt_o = 1'b1; // grant it even when invalid access to not block - endcase - end - end else begin - //---------------------------------------------------------------------------- - // read access - //---------------------------------------------------------------------------- - if (debug_addr_i[14]) begin - debug_gnt_o = 1'b1; // grant it even when invalid access to not block - - // CSR access - if (debug_halted_o) begin - // access to internal registers are only allowed when the core is halted - csr_req_n = 1'b1; - rdata_sel_n = RD_CSR; - end - end else begin - // non-CSR access - unique case (debug_addr_i[13:8]) - 6'b00_0000: begin // Debug Registers, always accessible - debug_gnt_o = 1'b1; - - rdata_sel_n = RD_DBGA; - end - - 6'b10_0000: begin // Debug Registers, only accessible when in debug - debug_gnt_o = 1'b1; // grant it even when invalid access to not block - - rdata_sel_n = RD_DBGS; - end - - 6'b00_0100: begin // General-Purpose Registers - debug_gnt_o = 1'b1; // grant it even when invalid access to not block - - if (debug_halted_o) begin - regfile_rreq_n = 1'b1; - rdata_sel_n = RD_GPR; - end - end - - 6'b00_0101: begin // General-Purpose Floating-Point Registers - debug_gnt_o = 1'b1; // grant it even when invalid access to not block - - if (debug_halted_o) begin - regfile_rreq_n = 1'b1; - regfile_fp_sel_n = 1'b1; - rdata_sel_n = RD_GPR; - end - end - default: debug_gnt_o = 1'b1; // grant it even when invalid access to not block - endcase - end - end - end - end - - //---------------------------------------------------------------------------- - // debug register read access - // - // Since those are combinational, we can do it in the cycle where we set - // rvalid. The address has been latched into addr_q - //---------------------------------------------------------------------------- - always_comb - begin - dbg_rdata = '0; - - case (rdata_sel_q) - RD_DBGA: begin - unique case (addr_q[6:2]) - 5'h00: dbg_rdata[31:0] = {15'b0, debug_halted_o, 15'b0, settings_q[DBG_SETS_SSTE]}; // DBG_CTRL - 5'h01: dbg_rdata[31:0] = {15'b0, sleeping_i, 15'b0, dbg_ssth_q}; // DBG_HIT - 5'h02: begin // DBG_IE - dbg_rdata[31:16] = '0; - dbg_rdata[15:12] = '0; - dbg_rdata[11] = settings_q[DBG_SETS_ECALL]; - dbg_rdata[10: 8] = '0; - dbg_rdata[ 7] = settings_q[DBG_SETS_ELSU]; - dbg_rdata[ 6] = 1'b0; - dbg_rdata[ 5] = settings_q[DBG_SETS_ELSU]; - dbg_rdata[ 4] = 1'b0; - dbg_rdata[ 3] = settings_q[DBG_SETS_EBRK]; - dbg_rdata[ 2] = settings_q[DBG_SETS_EILL]; - dbg_rdata[ 1: 0] = '0; - end - 5'h03: dbg_rdata = {dbg_cause_q[5], 26'b0, dbg_cause_q[4:0]}; // DBG_CAUSE - 5'h10: dbg_rdata = '0; // DBG_BPCTRL0 - 5'h12: dbg_rdata = '0; // DBG_BPCTRL1 - 5'h14: dbg_rdata = '0; // DBG_BPCTRL2 - 5'h16: dbg_rdata = '0; // DBG_BPCTRL3 - 5'h18: dbg_rdata = '0; // DBG_BPCTRL4 - 5'h1A: dbg_rdata = '0; // DBG_BPCTRL5 - 5'h1C: dbg_rdata = '0; // DBG_BPCTRL6 - 5'h1E: dbg_rdata = '0; // DBG_BPCTRL7 - default:; - endcase - end - - RD_DBGS: begin - unique case (addr_q[2:2]) - 1'b0: dbg_rdata = npc_int; // DBG_NPC - 1'b1: dbg_rdata = ppc_int; // DBG_PPC - default:; - endcase - end - - default:; - endcase - end - - //---------------------------------------------------------------------------- - // read data mux - //---------------------------------------------------------------------------- - always_comb - begin - debug_rdata_o = '0; - - case (rdata_sel_q) - RD_CSR: debug_rdata_o = csr_rdata_i; - RD_GPR: debug_rdata_o = regfile_rdata_i; - RD_DBGA: debug_rdata_o = dbg_rdata; - RD_DBGS: debug_rdata_o = dbg_rdata; - endcase - end - - //---------------------------------------------------------------------------- - // rvalid generation - //---------------------------------------------------------------------------- - always_ff @(posedge clk, negedge rst_n) - begin - if (~rst_n) begin - debug_rvalid_o <= 1'b0; - end else begin - debug_rvalid_o <= debug_gnt_o; // always give the rvalid one cycle after gnt - end - end - - //---------------------------------------------------------------------------- - // stall control - //---------------------------------------------------------------------------- - always_comb - begin - stall_ns = stall_cs; - dbg_req_o = 1'b0; - stall_o = 1'b0; - debug_halted_o = 1'b0; - dbg_cause_n = dbg_cause_q; - dbg_ssth_n = dbg_ssth_q; - - case (stall_cs) - RUNNING: begin - dbg_ssth_n = 1'b0; - - if (dbg_halt | debug_halt_i | trap_i) begin - dbg_req_o = 1'b1; - stall_ns = HALT_REQ; - - if (trap_i) begin - if (settings_q[DBG_SETS_SSTE]) - dbg_ssth_n = 1'b1; - - dbg_cause_n = exc_cause_i; - end else begin - dbg_cause_n = DBG_CAUSE_HALT; - end - end - end - - HALT_REQ: begin - dbg_req_o = 1'b1; - - if (dbg_ack_i) - stall_ns = HALT; - - if (dbg_resume | debug_resume_i) - stall_ns = RUNNING; - end - - HALT: begin - stall_o = 1'b1; - debug_halted_o = 1'b1; - - if (dbg_resume | debug_resume_i) begin - stall_ns = RUNNING; - stall_o = 1'b0; - end - end - endcase - - if (ssth_clear) - dbg_ssth_n = 1'b0; - end - - always_ff @(posedge clk, negedge rst_n) - begin - if (~rst_n) begin - stall_cs <= RUNNING; - dbg_cause_q <= DBG_CAUSE_HALT; - dbg_ssth_q <= 1'b0; - end else begin - stall_cs <= stall_ns; - dbg_cause_q <= dbg_cause_n; - dbg_ssth_q <= dbg_ssth_n; - end - end - - //---------------------------------------------------------------------------- - // NPC/PPC selection - //---------------------------------------------------------------------------- - always_comb - begin - pc_tracking_fsm_ns = pc_tracking_fsm_cs; - - ppc_int = pc_id_i; - npc_int = pc_if_i; - - // PPC/NPC mux - unique case (pc_tracking_fsm_cs) - IFID: begin - ppc_int = pc_id_i; - npc_int = pc_if_i; - end - - IFEX: begin - ppc_int = pc_ex_i; - npc_int = pc_if_i; - end - - IDEX: begin - ppc_int = pc_ex_i; - npc_int = pc_id_i; - - if (jump_req_o) - pc_tracking_fsm_ns = IFEX; - end - - default: begin - pc_tracking_fsm_ns = IFID; - end - endcase - - // set state if trap is encountered - if (dbg_ack_i) begin - pc_tracking_fsm_ns = IFID; - - if (branch_in_ex_i) begin - if (branch_taken_i) - pc_tracking_fsm_ns = IFEX; - else - pc_tracking_fsm_ns = IDEX; - end else if (data_load_event_i) begin - // for p.elw - if (instr_valid_id_i) - pc_tracking_fsm_ns = IDEX; - else - pc_tracking_fsm_ns = IFEX; - end - end - end - - - always_ff @(posedge clk, negedge rst_n) - begin - if (~rst_n) begin - pc_tracking_fsm_cs <= IFID; - - addr_q <= '0; - wdata_q <= '0; - state_q <= FIRST; - rdata_sel_q <= RD_NONE; - regfile_rreq_q <= 1'b0; - regfile_fp_sel_q <= 1'b0; - csr_req_q <= 1'b0; - jump_req_q <= 1'b0; - - settings_q <= 1'b0; - end else begin - pc_tracking_fsm_cs <= pc_tracking_fsm_ns; - - // settings - settings_q <= settings_n; - - // for the actual interface - if (debug_req_i) begin - addr_q <= debug_addr_i; - wdata_q <= debug_wdata_i; - state_q <= state_n; - end - - if (debug_req_i | debug_rvalid_o) begin - // wait for either req or rvalid to set those FFs - // This makes sure that they are only triggered once when there is - // only one request, and the FFs can be properly clock gated otherwise - regfile_rreq_q <= regfile_rreq_n; - regfile_fp_sel_q <= regfile_fp_sel_n; - csr_req_q <= csr_req_n; - jump_req_q <= jump_req_n; - rdata_sel_q <= rdata_sel_n; - end - end - end - - assign regfile_rreq_o = regfile_rreq_q; - assign regfile_raddr_o = {regfile_fp_sel_q, addr_q[6:2]}; - - - assign regfile_wreq_o = regfile_wreq; - assign regfile_waddr_o = {regfile_fp_wr,debug_addr_i[6:2]}; - assign regfile_wdata_o = debug_wdata_i; - - assign csr_req_o = csr_req_q; - assign csr_addr_o = addr_q[13:2]; - assign csr_wdata_o = wdata_q; - - assign jump_req_o = jump_req_q; - assign jump_addr_o = wdata_q; - - assign settings_o = settings_q; - - //---------------------------------------------------------------------------- - // Assertions - //---------------------------------------------------------------------------- - `ifndef VERILATOR - // check that no registers are accessed when we are not in debug mode - assert property ( - @(posedge clk) (debug_req_i) |-> ((debug_halted_o == 1'b1) || - ((debug_addr_i[14] != 1'b1) && - (debug_addr_i[13:7] != 5'b0_1001) && - (debug_addr_i[13:7] != 5'b0_1000)) ) ) - else $warning("Trying to access internal debug registers while core is not stalled"); - - // check that all accesses are word-aligned - assert property ( - @(posedge clk) (debug_req_i) |-> (debug_addr_i[1:0] == 2'b00) ); - `endif -endmodule // debug_unit diff --git a/src_files.yml b/src_files.yml index c5094b4..ce35adb 100644 --- a/src_files.yml +++ b/src_files.yml @@ -30,7 +30,6 @@ riscv: ./rtl/riscv_compressed_decoder.sv, ./rtl/riscv_controller.sv, ./rtl/riscv_cs_registers.sv, - ./rtl/riscv_debug_unit.sv, ./rtl/riscv_decoder.sv, ./rtl/riscv_int_controller.sv, ./rtl/riscv_ex_stage.sv, @@ -113,4 +112,4 @@ tb_riscv: tb/tb_riscv/riscv_perturbation.sv, tb/tb_riscv/riscv_random_interrupt_generator.sv, tb/tb_riscv/riscv_random_stall.sv, - ] \ No newline at end of file + ] diff --git a/verilator-model/Makefile b/verilator-model/Makefile index 8769b0c..d45beda 100644 --- a/verilator-model/Makefile +++ b/verilator-model/Makefile @@ -52,7 +52,6 @@ VSRC = cluster_clock_gating.sv \ ../rtl/riscv_compressed_decoder.sv \ ../rtl/riscv_controller.sv \ ../rtl/riscv_cs_registers.sv \ - ../rtl/riscv_debug_unit.sv \ ../rtl/riscv_decoder.sv \ ../rtl/riscv_int_controller.sv \ ../rtl/riscv_ex_stage.sv \ From 2236b9dc8cc61fb082d2612a9d24af607ab43225 Mon Sep 17 00:00:00 2001 From: Pasquale Davide Schiavone Date: Tue, 16 Apr 2019 15:57:19 +0200 Subject: [PATCH 11/24] fix ex_stage with FP inst --- rtl/riscv_ex_stage.sv | 60 +++++++++++++++++++++---------------------- 1 file changed, 30 insertions(+), 30 deletions(-) diff --git a/rtl/riscv_ex_stage.sv b/rtl/riscv_ex_stage.sv index 71bd8e8..1fe93c5 100644 --- a/rtl/riscv_ex_stage.sv +++ b/rtl/riscv_ex_stage.sv @@ -397,15 +397,15 @@ module riscv_ex_stage logic fpu_op_mod; logic fpu_vec_op; - logic [C_FPNEW_FMTBITS-1:0] fpu_fmt; - logic [C_FPNEW_FMTBITS-1:0] fpu_fmt2; - logic [C_FPNEW_IFMTBITS-1:0] fpu_ifmt; + logic [C_FPNEW_FMTBITS-1:0] fpu_dst_fmt; + logic [C_FPNEW_FMTBITS-1:0] fpu_src_fmt; + logic [C_FPNEW_IFMTBITS-1:0] fpu_int_fmt; logic [C_RM-1:0] fp_rnd_mode; assign {fpu_vec_op, fpu_op_mod, fpu_op} = apu_op_i; - assign {fpu_ifmt, fpu_fmt2, fpu_fmt, fp_rnd_mode} = apu_flags_i; + assign {fpu_int_fmt, fpu_src_fmt, fpu_dst_fmt, fp_rnd_mode} = apu_flags_i; - localparam C_DIV = FP_DIVSQRT ? 2 : 0; + localparam C_DIV = FP_DIVSQRT ? fpnew_pkg::MERGED : fpnew_pkg::DISABLED; logic FPU_ready_int; @@ -416,7 +416,7 @@ module riscv_ex_stage localparam fpnew_pkg::fpu_features_t FPU_FEATURES = '{ Width: C_FLEN, EnableVectors: C_XFVEC, - EnableNanBox: 1'b1, + EnableNanBox: 1'b0, FpFmtMask: {C_RVF, C_RVD, C_XF16, C_XF8, C_XF16ALT}, IntFmtMask: {C_XFVEC && C_XF8, C_XFVEC && (C_XF16 || C_XF16ALT), 1'b1, 1'b0} }; @@ -428,7 +428,7 @@ module riscv_ex_stage '{default: C_LAT_DIVSQRT}, // DIVSQRT '{default: C_LAT_NONCOMP}, // NONCOMP '{default: C_LAT_CONV}}, // CONV - UnitTypes: '{'{default: fpnew_pkg::PARALLEL}, // ADDMUL + UnitTypes: '{'{default: fpnew_pkg::MERGED}, // ADDMUL '{default: C_DIV}, // DIVSQRT '{default: fpnew_pkg::PARALLEL}, // NONCOMP '{default: fpnew_pkg::MERGED}}, // CONV @@ -440,30 +440,30 @@ module riscv_ex_stage //--------------- fpnew_top #( - .Features ( FPU_FEATURES ), - .Implementaion ( FPU_IMPLEMENTATION ), - .TagType ( logic ) + .Features ( FPU_FEATURES ), + .Implementation ( FPU_IMPLEMENTATION ), + .TagType ( logic ) ) i_fpnew_bulk ( - .clk_i ( clk ), - .rst_ni ( rst_n ), - .operands_i ( apu_operands_i ), - .rnd_mode_i ( fpnew_pkg::roundmode_e'(fp_rnd_mode) ), - .op_i ( fpnew_pkg::operation_e'(fpu_op) ), - .op_mod_i ( fpu_op_mod ), - .fp_fmt_i ( fpnew_pkg::fp_format_e'(fpu_fmt) ), - .fp_fmt2_i ( fpnew_pkg::fp_format_e'(fpu_fmt2) ), - .int_fmt_i ( fpnew_pkg::int_format_e'(fpu_ifmt) ), - .vectorial_op_i ( fpu_vec_op ), - .tag_i ( 1'b0 ), - .in_valid_i ( apu_req ), - .in_ready_o ( FPU_ready_int ), - .flush_i ( 1'b0 ), - .result_o ( apu_result ), - .status_o ( fpu_fflags_o ), - .tag_o ( /* unused */ ), - .out_valid_o ( apu_valid ), - .out_ready_i ( 1'b1 ), - .busy_o ( /* unused */ ) + .clk_i ( clk ), + .rst_ni ( rst_n ), + .operands_i ( apu_operands_i ), + .rnd_mode_i ( fpnew_pkg::roundmode_e'(fp_rnd_mode) ), + .op_i ( fpnew_pkg::operation_e'(fpu_op) ), + .op_mod_i ( fpu_op_mod ), + .src_fmt_i ( fpnew_pkg::fp_format_e'(fpu_src_fmt) ), + .dst_fmt_i ( fpnew_pkg::fp_format_e'(fpu_dst_fmt) ), + .int_fmt_i ( fpnew_pkg::int_format_e'(fpu_int_fmt) ), + .vectorial_op_i ( fpu_vec_op ), + .tag_i ( 1'b0 ), + .in_valid_i ( apu_req ), + .in_ready_o ( FPU_ready_int ), + .flush_i ( 1'b0 ), + .result_o ( apu_result ), + .status_o ( fpu_fflags_o ), + .tag_o ( /* unused */ ), + .out_valid_o ( apu_valid ), + .out_ready_i ( 1'b1 ), + .busy_o ( /* unused */ ) ); assign fpu_fflags_we_o = apu_valid; From 08a95b12db0912e5ca3bb28638b5cd18182ab45f Mon Sep 17 00:00:00 2001 From: Stefan Mach <33124232+stmach@users.noreply.github.com> Date: Tue, 16 Apr 2019 16:03:09 +0200 Subject: [PATCH 12/24] Update FPU defines for single precision --- rtl/include/riscv_defines.sv | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/rtl/include/riscv_defines.sv b/rtl/include/riscv_defines.sv index 20c8564..4a53b76 100644 --- a/rtl/include/riscv_defines.sv +++ b/rtl/include/riscv_defines.sv @@ -383,9 +383,9 @@ parameter bit C_RVD = 1'b0; // Is D extension enabled - NOT SUPPORTED CURRENTLY // Transprecision floating-point extensions configuration parameter bit C_XF16 = 1'b0; // Is half-precision float extension (Xf16) enabled -parameter bit C_XF16ALT = 1'b1; // Is alternative half-precision float extension (Xf16alt) enabled +parameter bit C_XF16ALT = 1'b0; // Is alternative half-precision float extension (Xf16alt) enabled parameter bit C_XF8 = 1'b0; // Is quarter-precision float extension (Xf8) enabled -parameter bit C_XFVEC = 1'b1; // Is vectorial float extension (Xfvec) enabled +parameter bit C_XFVEC = 1'b0; // Is vectorial float extension (Xfvec) enabled // FPnew configuration parameter C_FPNEW_OPBITS = fpnew_pkg::OP_BITS; @@ -394,13 +394,13 @@ parameter C_FPNEW_IFMTBITS = fpnew_pkg::INT_FORMAT_BITS; // Latency of FP operations: 0 = no pipe registers, 1 = 1 pipe register etc. parameter int unsigned C_LAT_FP64 = 'd0; -parameter int unsigned C_LAT_FP32 = 'd2; +parameter int unsigned C_LAT_FP32 = 'd0; parameter int unsigned C_LAT_FP16 = 'd0; -parameter int unsigned C_LAT_FP16ALT = 'd1; +parameter int unsigned C_LAT_FP16ALT = 'd0; parameter int unsigned C_LAT_FP8 = 'd0; -parameter int unsigned C_LAT_DIVSQRT = 'd1; // divsqrt post-processing pipe -parameter int unsigned C_LAT_CONV = 'd1; -parameter int unsigned C_LAT_NONCOMP = 'd1; +parameter int unsigned C_LAT_DIVSQRT = 'd0; // divsqrt post-processing pipe +parameter int unsigned C_LAT_CONV = 'd0; +parameter int unsigned C_LAT_NONCOMP = 'd0; // General FPU-specific defines From 6ba11daa6c03942a007af3f11e332b40c01e7f53 Mon Sep 17 00:00:00 2001 From: Stefan Mach <33124232+stmach@users.noreply.github.com> Date: Tue, 16 Apr 2019 16:05:35 +0200 Subject: [PATCH 13/24] Update FPU implementation to PARALLEL --- rtl/riscv_ex_stage.sv | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rtl/riscv_ex_stage.sv b/rtl/riscv_ex_stage.sv index 1fe93c5..bd7da16 100644 --- a/rtl/riscv_ex_stage.sv +++ b/rtl/riscv_ex_stage.sv @@ -428,7 +428,7 @@ module riscv_ex_stage '{default: C_LAT_DIVSQRT}, // DIVSQRT '{default: C_LAT_NONCOMP}, // NONCOMP '{default: C_LAT_CONV}}, // CONV - UnitTypes: '{'{default: fpnew_pkg::MERGED}, // ADDMUL + UnitTypes: '{'{default: fpnew_pkg::PARALLEL}, // ADDMUL '{default: C_DIV}, // DIVSQRT '{default: fpnew_pkg::PARALLEL}, // NONCOMP '{default: fpnew_pkg::MERGED}}, // CONV From 9bde93c932ad5fbd23fc7d43a744ff5936a899ae Mon Sep 17 00:00:00 2001 From: Pasquale Davide Schiavone Date: Tue, 16 Apr 2019 19:11:17 +0200 Subject: [PATCH 14/24] fixed parameter in id stage --- rtl/riscv_id_stage.sv | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rtl/riscv_id_stage.sv b/rtl/riscv_id_stage.sv index c58ead2..99fa762 100644 --- a/rtl/riscv_id_stage.sv +++ b/rtl/riscv_id_stage.sv @@ -946,7 +946,7 @@ module riscv_id_stage register_file_test_wrap #( .ADDR_WIDTH(6), - .FPU(0) // forcing the register_file fr FP to be disabled + .FPU(FPU) ) registers_i ( From 9b9f02f520dc0b2c87ec5482ce931e3d46a4a888 Mon Sep 17 00:00:00 2001 From: Pasquale Davide Schiavone Date: Wed, 17 Apr 2019 09:59:50 +0200 Subject: [PATCH 15/24] update doc --- doc/user_manual.doc | Bin 1500672 -> 1408000 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/doc/user_manual.doc b/doc/user_manual.doc index 4697e40216e18d52340ec4f653563089aad65871..d2bb56d1df6db2776a17093be302019a8e87da9b 100644 GIT binary patch delta 125838 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⁢JwvOY(a8MpSUS2zrJe=$$v^g+`ah;#dtIW*m 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 From efc02fc77cf250d3c2c618ae406ca6cbe0689e7e Mon Sep 17 00:00:00 2001 From: bluew Date: Wed, 17 Apr 2019 19:58:13 +0200 Subject: [PATCH 16/24] Fix single stepping over ecall and xret We need to execute more of the regular controller for ecall and xrets to properly grab the target address to store into dpc. This is done similarily as for the illegal instruction: we go through FLUSH_WB as would be done when we weren't single stepping and fork there by checking for the single stepping condition. * Rewrite single step handling in DECODE state * Add single stepping over ebreak when ebreakm is low --- rtl/riscv_controller.sv | 48 +++++++++++++++++++++++++---------------- 1 file changed, 29 insertions(+), 19 deletions(-) diff --git a/rtl/riscv_controller.sv b/rtl/riscv_controller.sv index 66cb71a..091e2f5 100644 --- a/rtl/riscv_controller.sv +++ b/rtl/riscv_controller.sv @@ -544,21 +544,32 @@ module riscv_controller // prevent any more instructions from executing halt_if_o = 1'b1; - if (illegal_insn_i) begin - ctrl_fsm_ns = DBG_FLUSH; - end else if (id_ready_i) begin + // we don't handle dret here because its should be illegal + // anyway in this context + + // illegal, ecall, ebrk and xrettransition to later to a DBG + // state since we need the return address which is + // determined later + + // TODO: handle ebrk_force_debug_mode plus single stepping over ebreak + if (id_ready_i) begin // make sure the current instruction has been executed unique case(1'b1) + illegal_insn_i | ecall_insn_i: + ctrl_fsm_ns = FLUSH_EX; // TODO: flush ex + (~ebrk_force_debug_mode & ebrk_insn_i): + ctrl_fsm_ns = FLUSH_EX; + mret_insn_i | uret_insn_i: + ctrl_fsm_ns = FLUSH_EX; branch_in_id: ctrl_fsm_ns = DBG_WAIT_BRANCH; default: + // regular instruction ctrl_fsm_ns = DBG_FLUSH; endcase // unique case (1'b1) end - end - end //decoding block endcase end //valid block @@ -739,6 +750,8 @@ module riscv_controller trap_addr_mux_o = TRAP_MACHINE; exc_pc_mux_o = EXC_PC_EXCEPTION; + if (debug_single_step_i && ~debug_mode_q) + ctrl_fsm_ns = DBG_TAKEN_IF; end ecall_insn_i: begin //ecall @@ -749,6 +762,8 @@ module riscv_controller // TODO: why is this here, signal only needed for async exceptions exc_cause_o = EXC_CAUSE_ECALL_MMODE; + if (debug_single_step_i && ~debug_mode_q) + ctrl_fsm_ns = DBG_TAKEN_IF; end illegal_insn_i: begin //exceptions @@ -757,6 +772,8 @@ module riscv_controller trap_addr_mux_o = TRAP_MACHINE; exc_pc_mux_o = EXC_PC_EXCEPTION; + if (debug_single_step_i && ~debug_mode_q) + ctrl_fsm_ns = DBG_TAKEN_IF; end mret_insn_i: begin csr_restore_mret_id_o = 1'b1; @@ -788,12 +805,6 @@ module riscv_controller end - if (debug_single_step_i & ~debug_mode_q) begin - // this is the path for instructions to the debug mode that need - // FLUSH_WB e.g. illegal_insn_i. The already fetched instruction will - // be the address we set the dpc to, therefore we got to DBG_TAKEN_IF. - ctrl_fsm_ns = DBG_TAKEN_IF; - end end XRET_JUMP: @@ -823,6 +834,10 @@ module riscv_controller end default:; endcase + + if (debug_single_step_i && ~debug_mode_q) begin + ctrl_fsm_ns = DBG_TAKEN_IF; + end end // a branch was in ID when a trying to go to debug rom wait until we can @@ -909,17 +924,12 @@ module riscv_controller end //data error else begin - if(illegal_insn_i) begin - //check done to prevent data harzard in the CSR registers - if (ex_valid_i) - ctrl_fsm_ns = FLUSH_WB; - - end else if(debug_mode_q) begin //ebreak in debug rom + if(debug_mode_q) begin //ebreak in debug rom ctrl_fsm_ns = DBG_TAKEN_ID; end else if(data_load_event_i) begin ctrl_fsm_ns = DBG_TAKEN_ID; - end else if (debug_single_step_i)begin - // save the next instruction when single stepping + end else if (debug_single_step_i) begin + // save the next instruction when single stepping regular insn ctrl_fsm_ns = DBG_TAKEN_IF; end else begin ctrl_fsm_ns = DBG_TAKEN_ID; From 65ed57d8790873b816d79d6c269530caa55172d8 Mon Sep 17 00:00:00 2001 From: bluew Date: Thu, 23 May 2019 15:36:18 +0200 Subject: [PATCH 17/24] Fix openocd checkout procedure --- ci/get-openocd.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/get-openocd.sh b/ci/get-openocd.sh index ea7570b..a380a1e 100755 --- a/ci/get-openocd.sh +++ b/ci/get-openocd.sh @@ -21,7 +21,7 @@ fi if ! [ -e $RISCV/bin/openocd ]; then if ! [ -e $RISCV/riscv-openocd ]; then - git clone --depth 1 https://github.com/riscv/riscv-openocd.git + git clone https://github.com/riscv/riscv-openocd.git fi check_version automake 1.14 "OpenOCD build" check_version autoconf 2.64 "OpenOCD build" From d212b7fa7a261c17cdb6b9b90ca4db0b20da324b Mon Sep 17 00:00:00 2001 From: bluew Date: Mon, 3 Jun 2019 05:20:05 +0200 Subject: [PATCH 18/24] Fix tb run command in tb readme --- tb/core/README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tb/core/README.md b/tb/core/README.md index ea17cdf..6d14644 100644 --- a/tb/core/README.md +++ b/tb/core/README.md @@ -11,9 +11,9 @@ signal success or failure by writing `12345679` or `1` respectively to Running the testbench with vsim ---------------------- -Point you environment variable `RISCV` to your RISC-V toolchain. -Call `make firmware-vsim-run` to build the testbench and the firmware, and run it. -Use `VSIM_FLAGS` to configure the simulator e.g. `make firmware-run +Point you environment variable `RISCV` to your RISC-V toolchain. Call `make +firmware-vsim-run` to build the testbench and the firmware, and run it. Use +`VSIM_FLAGS` to configure the simulator e.g. `make firmware-vsim-run VSIM_FLAGS="-gui -debugdb"`. Running the testbench with vcs @@ -45,4 +45,4 @@ build and link your own program. Have a look at `picorv_firmware/start.S` and Examples ----------------------- Run all riscv-tests to completion and produce a vcd dump: -`make firmware-run VSIM_FLAGS=+vcd` \ No newline at end of file +`make firmware-vsim-run VSIM_FLAGS=+vcd` From a64c19c4c187af419104308cc7609e8fc0c8f7bf Mon Sep 17 00:00:00 2001 From: Pasquale Davide Schiavone Date: Tue, 4 Jun 2019 14:18:50 +0200 Subject: [PATCH 19/24] I-MISALIGN_LDST test disabled as RISCY supports misaligned LDST --- .../riscv_compliance_tests/{ => disabled}/I-MISALIGN_LDST-01.S | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename tb/core/riscv_compliance_tests/{ => disabled}/I-MISALIGN_LDST-01.S (100%) diff --git a/tb/core/riscv_compliance_tests/I-MISALIGN_LDST-01.S b/tb/core/riscv_compliance_tests/disabled/I-MISALIGN_LDST-01.S similarity index 100% rename from tb/core/riscv_compliance_tests/I-MISALIGN_LDST-01.S rename to tb/core/riscv_compliance_tests/disabled/I-MISALIGN_LDST-01.S From dac9486bc6e6af4e204674cdaf755c744f50038d Mon Sep 17 00:00:00 2001 From: Pasquale Davide Schiavone Date: Tue, 4 Jun 2019 14:19:22 +0200 Subject: [PATCH 20/24] I-MISALIGN_LDST test disabled from firmware --- tb/core/firmware/start.S | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tb/core/firmware/start.S b/tb/core/firmware/start.S index 8dc0d16..f087f62 100644 --- a/tb/core/firmware/start.S +++ b/tb/core/firmware/start.S @@ -303,7 +303,7 @@ start: TEST(I_EBREAK_01) TEST(I_ECALL_01) TEST(I_ENDIANESS_01) - TEST(I_FENCE.I_01) /* fails */ + TEST(I_FENCE.I_01) TEST(I_IO) TEST(I_JAL_01) @@ -318,7 +318,7 @@ start: /* bad test: RI5CY supports C extension meaning no exception on misaligned jumps */ /* TEST(I_MISALIGN_JMP_01) */ - TEST(I_MISALIGN_LDST_01) /* fails */ + /* TEST(I_MISALIGN_LDST_01) /* fails */ TEST(I_NOP_01) TEST(I_OR_01) From 1ed807ea1e2b85658e2c83725970ff19f49dd1d3 Mon Sep 17 00:00:00 2001 From: Pasquale Davide Schiavone Date: Tue, 4 Jun 2019 14:21:13 +0200 Subject: [PATCH 21/24] :sparkles: added MSCRATCH register --- rtl/riscv_cs_registers.sv | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/rtl/riscv_cs_registers.sv b/rtl/riscv_cs_registers.sv index a63d8f9..e7f72bb 100644 --- a/rtl/riscv_cs_registers.sv +++ b/rtl/riscv_cs_registers.sv @@ -238,6 +238,7 @@ module riscv_cs_registers logic [31:0] depc_q, depc_n; logic [31:0] dscratch0_q, dscratch0_n; logic [31:0] dscratch1_q, dscratch1_n; + logic [31:0] mscratch_q, mscratch_n; logic [31:0] exception_pc; Status_t mstatus_q, mstatus_n; @@ -312,6 +313,8 @@ if(PULP_SECURE==1) begin }; // mtvec: machine trap-handler base address 12'h305: csr_rdata_int = {mtvec_q, 6'h0, MTVEC_MODE}; + // mscratch: machine scratch + 12'h340: csr_rdata_int = mscratch_q; // mepc: exception program counter 12'h341: csr_rdata_int = mepc_q; // mcause: exception cause @@ -395,6 +398,8 @@ end else begin //PULP_SECURE == 0 12'h301: csr_rdata_int = 32'h0; // mtvec: machine trap-handler base address 12'h305: csr_rdata_int = {mtvec_q, 6'h0, MTVEC_MODE}; + // mscratch: machine scratch + 12'h340: csr_rdata_int = mscratch_q; // mepc: exception program counter 12'h341: csr_rdata_int = mepc_q; // mcause: exception cause @@ -436,6 +441,7 @@ if(PULP_SECURE==1) begin fflags_n = fflags_q; frm_n = frm_q; fprec_n = fprec_q; + mscratch_n = mscratch_q; mepc_n = mepc_q; uepc_n = uepc_q; depc_n = depc_q; @@ -484,6 +490,10 @@ if(PULP_SECURE==1) begin 12'h305: if (csr_we_int) begin mtvec_n = csr_wdata_int[31:8]; end + // mscratch: machine scratch + 12'h340: if (csr_we_int) begin + mscratch_n = csr_wdata_int; + end // mepc: exception program counter 12'h341: if (csr_we_int) begin mepc_n = csr_wdata_int; @@ -690,6 +700,7 @@ end else begin //PULP_SECURE == 0 fflags_n = fflags_q; frm_n = frm_q; fprec_n = fprec_q; + mscratch_n = mscratch_q; mepc_n = mepc_q; depc_n = depc_q; dcsr_n = dcsr_q; @@ -732,6 +743,10 @@ end else begin //PULP_SECURE == 0 mprv: csr_wdata_int[`MSTATUS_MPRV_BITS] }; end + // mscratch: machine scratch + 12'h340: if (csr_we_int) begin + mscratch_n = csr_wdata_int; + end // mepc: exception program counter 12'h341: if (csr_we_int) begin mepc_n = csr_wdata_int; @@ -975,6 +990,7 @@ end //PULP_SECURE dcsr_q.prv <= PRIV_LVL_M; dscratch0_q <= '0; dscratch1_q <= '0; + mscratch_q <= '0; end else begin @@ -1003,7 +1019,7 @@ end //PULP_SECURE dcsr_q <= dcsr_n; dscratch0_q<= dscratch0_n; dscratch1_q<= dscratch1_n; - + mscratch_q <= mscratch_n; end end From 4cc04001fabdc9cbbb7887a3d94f63677e9471c2 Mon Sep 17 00:00:00 2001 From: zdogs <51697819+zdogs@users.noreply.github.com> Date: Tue, 11 Jun 2019 14:35:07 +0200 Subject: [PATCH 22/24] Fix typo line 360 --- rtl/riscv_pmp.sv | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rtl/riscv_pmp.sv b/rtl/riscv_pmp.sv index d857e67..8fc42ab 100644 --- a/rtl/riscv_pmp.sv +++ b/rtl/riscv_pmp.sv @@ -357,7 +357,7 @@ module riscv_pmp `ifdef DEBUG_RULE $display(" NAPOT[%d] --> BYTE_ALIGN_32KB: %8h<-- addr --> %8h", i, start_addr[i]<<2, stop_addr[i]<<2 ); `endif end `endif - `ifdef EN_NAPOT_RULE_64KBB + `ifdef EN_NAPOT_RULE_64KB `RULE_13: begin: BYTE_ALIGN_64KB mask_addr[i] = 32'hFFFF_C000; From 1449ba6a8be1a0c2b061517d270bd9229ec8540a Mon Sep 17 00:00:00 2001 From: Pasquale Davide Schiavone Date: Mon, 24 Jun 2019 11:32:10 +0200 Subject: [PATCH 23/24] fix :bug: No Exception when code in User mode attempts to write in Machine mode register #81 --- rtl/riscv_controller.sv | 28 ++++++++++++++++++++-------- 1 file changed, 20 insertions(+), 8 deletions(-) diff --git a/rtl/riscv_controller.sv b/rtl/riscv_controller.sv index 091e2f5..3826c88 100644 --- a/rtl/riscv_controller.sv +++ b/rtl/riscv_controller.sv @@ -199,6 +199,8 @@ module riscv_controller logic debug_mode_q, debug_mode_n; logic ebrk_force_debug_mode; + logic illegal_insn_q, illegal_insn_n; + `ifndef SYNTHESIS // synopsys translate_off // make sure we are called later so that we do not generate messages for @@ -274,6 +276,7 @@ module riscv_controller debug_cause_o = DBG_CAUSE_EBREAK; debug_mode_n = debug_mode_q; + illegal_insn_n = illegal_insn_q; // a trap towards the debug unit is generated when one of the // following conditions are true: // - ebreak instruction encountered @@ -463,7 +466,7 @@ module riscv_controller csr_save_cause_o = 1'b1; csr_cause_o = EXC_CAUSE_ILLEGAL_INSN; ctrl_fsm_ns = FLUSH_EX; - + illegal_insn_n = 1'b1; end else begin //decoding block @@ -597,7 +600,9 @@ module riscv_controller //no jump in this stage as we have to wait one cycle to go to Machine Mode csr_cause_o = data_we_ex_i ? EXC_CAUSE_STORE_FAULT : EXC_CAUSE_LOAD_FAULT; ctrl_fsm_ns = FLUSH_WB; - + //putting illegal to 0 as if it was 1, the core is going to jump to the exception of the EX stage, + //so the illegal was never executed + illegal_insn_n = 1'b0; end //data erro else if (ex_valid_i) //check done to prevent data harzard in the CSR registers @@ -765,13 +770,13 @@ module riscv_controller if (debug_single_step_i && ~debug_mode_q) ctrl_fsm_ns = DBG_TAKEN_IF; end - illegal_insn_i: begin + illegal_insn_q: begin //exceptions pc_mux_o = PC_EXCEPTION; pc_set_o = 1'b1; trap_addr_mux_o = TRAP_MACHINE; exc_pc_mux_o = EXC_PC_EXCEPTION; - + illegal_insn_n = 1'b0; if (debug_single_step_i && ~debug_mode_q) ctrl_fsm_ns = DBG_TAKEN_IF; end @@ -816,13 +821,11 @@ module riscv_controller //mret pc_mux_o = PC_MRET; pc_set_o = 1'b1; - end uret_dec_i: begin //uret pc_mux_o = PC_URET; pc_set_o = 1'b1; - end dret_dec_i: begin //dret @@ -830,7 +833,12 @@ module riscv_controller pc_mux_o = PC_DRET; pc_set_o = 1'b1; debug_mode_n = 1'b0; - + end + illegal_insn_q: begin + //dret + //TODO: is illegal when not in debug mode + pc_mux_o = PC_DRET; + pc_set_o = 1'b1; end default:; endcase @@ -1053,6 +1061,8 @@ module riscv_controller data_err_q <= 1'b0; debug_mode_q <= 1'b0; + illegal_insn_q <= 1'b0; + end else begin @@ -1063,7 +1073,9 @@ module riscv_controller data_err_q <= data_err_i; - debug_mode_q <= debug_mode_n; + debug_mode_q <= debug_mode_n; + + illegal_insn_q <= illegal_insn_n; end end From b24b1029750f333db6e8ffe6a681d87b71411cbe Mon Sep 17 00:00:00 2001 From: Pasquale Davide Schiavone Date: Mon, 24 Jun 2019 14:41:59 +0200 Subject: [PATCH 24/24] fixed non unique condition in unique case --- rtl/riscv_controller.sv | 127 +++++++++++++++++++--------------------- 1 file changed, 61 insertions(+), 66 deletions(-) diff --git a/rtl/riscv_controller.sv b/rtl/riscv_controller.sv index 3826c88..c4db18f 100644 --- a/rtl/riscv_controller.sv +++ b/rtl/riscv_controller.sv @@ -747,67 +747,68 @@ module riscv_controller end else begin - unique case(1'b1) - ebrk_insn_i: begin - //ebreak - pc_mux_o = PC_EXCEPTION; - pc_set_o = 1'b1; - trap_addr_mux_o = TRAP_MACHINE; - exc_pc_mux_o = EXC_PC_EXCEPTION; - - if (debug_single_step_i && ~debug_mode_q) - ctrl_fsm_ns = DBG_TAKEN_IF; - end - ecall_insn_i: begin - //ecall - pc_mux_o = PC_EXCEPTION; - pc_set_o = 1'b1; - trap_addr_mux_o = TRAP_MACHINE; - exc_pc_mux_o = EXC_PC_EXCEPTION; - // TODO: why is this here, signal only needed for async exceptions - exc_cause_o = EXC_CAUSE_ECALL_MMODE; - - if (debug_single_step_i && ~debug_mode_q) - ctrl_fsm_ns = DBG_TAKEN_IF; - end - illegal_insn_q: begin - //exceptions - pc_mux_o = PC_EXCEPTION; - pc_set_o = 1'b1; - trap_addr_mux_o = TRAP_MACHINE; - exc_pc_mux_o = EXC_PC_EXCEPTION; - illegal_insn_n = 1'b0; - if (debug_single_step_i && ~debug_mode_q) - ctrl_fsm_ns = DBG_TAKEN_IF; - end - mret_insn_i: begin - csr_restore_mret_id_o = 1'b1; - ctrl_fsm_ns = XRET_JUMP; - end - uret_insn_i: begin - csr_restore_uret_id_o = 1'b1; - ctrl_fsm_ns = XRET_JUMP; - end - dret_insn_i: begin - csr_restore_dret_id_o = 1'b1; - ctrl_fsm_ns = XRET_JUMP; - end - - csr_status_i: begin - - end - pipe_flush_i: begin - ctrl_fsm_ns = WAIT_SLEEP; - end - fencei_insn_i: begin - // we just jump to instruction after the fence.i since that - // forces the instruction cache to refetch - pc_mux_o = PC_FENCEI; - pc_set_o = 1'b1; - end - default:; - endcase + if(illegal_insn_q) begin + //exceptions + pc_mux_o = PC_EXCEPTION; + pc_set_o = 1'b1; + trap_addr_mux_o = TRAP_MACHINE; + exc_pc_mux_o = EXC_PC_EXCEPTION; + illegal_insn_n = 1'b0; + if (debug_single_step_i && ~debug_mode_q) + ctrl_fsm_ns = DBG_TAKEN_IF; + end else begin + unique case(1'b1) + ebrk_insn_i: begin + //ebreak + pc_mux_o = PC_EXCEPTION; + pc_set_o = 1'b1; + trap_addr_mux_o = TRAP_MACHINE; + exc_pc_mux_o = EXC_PC_EXCEPTION; + + if (debug_single_step_i && ~debug_mode_q) + ctrl_fsm_ns = DBG_TAKEN_IF; + end + ecall_insn_i: begin + //ecall + pc_mux_o = PC_EXCEPTION; + pc_set_o = 1'b1; + trap_addr_mux_o = TRAP_MACHINE; + exc_pc_mux_o = EXC_PC_EXCEPTION; + // TODO: why is this here, signal only needed for async exceptions + exc_cause_o = EXC_CAUSE_ECALL_MMODE; + + if (debug_single_step_i && ~debug_mode_q) + ctrl_fsm_ns = DBG_TAKEN_IF; + end + + mret_insn_i: begin + csr_restore_mret_id_o = 1'b1; + ctrl_fsm_ns = XRET_JUMP; + end + uret_insn_i: begin + csr_restore_uret_id_o = 1'b1; + ctrl_fsm_ns = XRET_JUMP; + end + dret_insn_i: begin + csr_restore_dret_id_o = 1'b1; + ctrl_fsm_ns = XRET_JUMP; + end + + csr_status_i: begin + end + pipe_flush_i: begin + ctrl_fsm_ns = WAIT_SLEEP; + end + fencei_insn_i: begin + // we just jump to instruction after the fence.i since that + // forces the instruction cache to refetch + pc_mux_o = PC_FENCEI; + pc_set_o = 1'b1; + end + default:; + endcase + end end end @@ -834,12 +835,6 @@ module riscv_controller pc_set_o = 1'b1; debug_mode_n = 1'b0; end - illegal_insn_q: begin - //dret - //TODO: is illegal when not in debug mode - pc_mux_o = PC_DRET; - pc_set_o = 1'b1; - end default:; endcase