wow - loopback in sim actually worksgit status

This commit is contained in:
Yehowshua Immanuel 2023-09-28 06:57:38 -04:00
parent ad1bdfc8b1
commit 9f90b00b25
10 changed files with 96 additions and 261 deletions

View file

@ -5,6 +5,15 @@ 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::*;
@ -29,46 +38,59 @@ module mkTop(ITop);
ISerializer # (FCLK, BAUD) serializer <- mkSerialize(fileHandle);
Core # (FCLK) core <- mkCore();
Reg#(Bit#(8)) ledReg <- mkReg(0);
Reg#(Bit#(8)) persist_led <- mkReg(0);
messageM("Hallo!!" + realToString(5));
rule attach_core_outputs;
ledReg <= core.get_led;
// 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 attach_core_inputs;
rule core_char_device_i;
core.put_char(deserializer.get);
endrule
// output methods
method Bit#(1) ftdi_rxd;
return serializer.bitLineOut;
endmethod
method Bit#(8) led;
return ledReg;
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#(UInt#(3)) count <- mkReg(0);
Reg#(Bool) init_C_functions <- mkReg(False);
Core#(FCLK) core <- mkCore();
// Rule to update and display the count
rule tick (True);
count <= unpack({1'b1, (pack(count))[2:1]});
($display)(count);
rule init_c_functions_once (!init_C_functions);
init_terminal();
setup_sigint_handler();
init_C_functions <= True;
endrule
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 (count == 6);
rule end_sim (was_ctrl_c_received());
restore_terminal();
$display("GOT CTRL+C");
($finish)();
endrule
endmodule