LaoShaw Posted May 24, 2022 Report Share Posted May 24, 2022 I have a UART done in systemc/TLM2 with tx/rx etc, how can it interact with the host-os(e.g. Linux)? For example my OS is booting on the systemc-tlm2-simulator and I need a console to interact with it. I don't fully know how to get either one below to work in the code, e.g. how to make TLM2 model to talk with outside world. Typical use case includes UART for console, or Ethernet for internet. In the case of UART: 1. how to use a separate xterm window that somehow works with the simulator for printf/input. 2. how to use my current Linux console(where it launches the simulator) directly without a separate xterm, i.e. the console's current stdio and stdout will be owned by the simulator after it is launched, kind of like QEMU's `-serial stdio`, i.e redirect simulator's IO to current Linux console. It sometimes is called "virtual host IO"? Any pointers are appreciated. Thanks! Quote Link to comment Share on other sites More sharing options...
David Black Posted May 24, 2022 Report Share Posted May 24, 2022 Several thoughts: 1. You could communicate with *NIX sockets or shared memory to another *NIX process. This will require coordinating use of shared buffers with semaphores and possibly mutexes to avoid collisions. The code will be tricky, but the results can be quite present. I would set software queues in both directions (in/out). 2. You could halt simulation when waiting for input, and just print output in the same window as the simulator. Simple, but impacts simulation speed and is potentially confusing. 3. A variation on #2 would be to use *NIX pipes to read/write to/from. You could use a separate terminal to write/read the pipes. Quote Link to comment Share on other sites More sharing options...
Eyck Posted May 24, 2022 Report Share Posted May 24, 2022 Since you asked for pointers: a variation of 1. of @David Black would be the use of websockets. In the VP at https://github.com/Minres/HIFIVE1-VP this is used to implement a terminal (talking to the UART) which opens a websocket so that a web browser can be used to interact with the uart. The sources of the terminal can be found at https://github.com/Minres/HIFIVE1-VP/blob/master/platform/src/sysc/terminal.cpp and https://github.com/Minres/HIFIVE1-VP/blob/master/platform/incl/sysc/top/terminal.h respectively. The content served by the server (to be found at https://github.com/Minres/HIFIVE1-VP/blob/master/platform/incl/sysc/sc_comm_singleton.h and https://github.com/Minres/HIFIVE1-VP/blob/master/platform/src/sysc/sc_comm_singleton.cpp ) and shown by the client is located at https://github.com/Minres/HIFIVE1-VP/tree/master/html Quote Link to comment Share on other sites More sharing options...
LaoShaw Posted May 24, 2022 Author Report Share Posted May 24, 2022 Thanks for the answers and pointers! I will look into these options along with figuring out how QEMU's `-serial stdio` worked. The goal is to make my TLM2 model's UART works just like QEMU's `-serial stdio` (no separate xterm, will reuse current console like QEMU does). There is another option using 'slirp' for both UART and Network but I have no clue how that works yet. Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.