riscv-bluespec-classic/src/Top.bsv
Yehowshua Immanuel 10ed5b8751 ready for demo
2024-03-20 03:30:28 -04:00

104 lines
2.5 KiB
Plaintext

package Top;
export mkTop;
export ITop(..);
// export mkSim;
import "BDPI" function Action init_terminal();
import "BDPI" function Action restore_terminal();
import "BDPI" function Bit#(8) get_char_from_terminal();
import "BDPI" function Int#(32) is_char_available();
import "BDPI" function Action write_char_to_terminal(Bit#(8) chr);
import "BDPI" function Action setup_sigint_handler();
import "BDPI" function Bool was_ctrl_c_received();
import Deserializer::*;
import Core::*;
import Serializer::*;
import BRAM::*;
typedef 25000000 FCLK;
typedef 9600 BAUD;
interface ITop;
(* always_ready *)
method Bit # (1) ftdi_rxd();
(* always_ready *)
method Bit # (8) led();
(* always_enabled , always_ready *)
method Action ftdi_txd(Bit#(1) bitIn);
endinterface
(* synthesize *)
module mkTop(ITop);
Handle fileHandle <- openFile("compile.log", WriteMode);
IDeserializer # (FCLK, BAUD) deserializer <- mkDeserialize(fileHandle);
ISerializer # (FCLK, BAUD) serializer <- mkSerialize(fileHandle);
Core # (FCLK) core <- mkCore();
Reg#(Bit#(8)) persist_led <- mkReg(0);
messageM("Hallo!!" + realToString(5));
// connect up core device
rule core_led_o;
persist_led <= core.get_led;
endrule
rule core_char_device_o;
serializer.putBit8(core.get_char);
endrule
rule core_char_device_i;
core.put_char(deserializer.get);
endrule
// output methods
method Bit#(1) ftdi_rxd;
return serializer.bitLineOut;
endmethod
method Action ftdi_txd(Bit#(1) bitIn);
deserializer.putBitIn(bitIn);
endmethod
method Bit#(8) led;
return persist_led;
endmethod
endmodule
module mkSim(Empty);
BRAM_Configure cfg = defaultValue;
// Define a 3-bit register named count
Reg#(UInt#(3)) count <- mkReg(0);
Reg#(Bool) init_C_functions <- mkReg(False);
Core#(FCLK) core <- mkCore();
rule init_c_functions_once (!init_C_functions);
init_terminal();
setup_sigint_handler();
init_C_functions <= True;
endrule
// implicit true - should always fire - effective making
// a loopback
rule core_char_device_o;
write_char_to_terminal(core.get_char);
endrule
rule core_char_device_i(is_char_available() == 1);
core.put_char(get_char_from_terminal());
endrule
// Rule to finish the simulation when count reaches 6
rule end_sim (was_ctrl_c_received());
restore_terminal();
$display("GOT CTRL+C");
($finish)();
endrule
endmodule
endpackage