We will build a RISC-V SoC targeting the ChipIgnite project from efabless.
This README shall be the starting point for the documentation.
The main tasks are the task you are responisble for and that you are expected to lead and complete. The secondary tasks are the tasks for which you are expected to monitor the progress and give help. Every group needs to deal with verification and the chip design toolchain.
- GitHub users: @UlrikTJ, @Emwm
- Main tasks: Serial IO (UART) + SPI (helping group 4)
- Secondary tasks: Text-based VGA
- GitHub users: @cjavad @MagnusAH
- Main tasks: Wildcat CPU integration + System integration (e.i. maintaing top level) + Look into Caravel
- Secondary tasks: Serial IO (UART), Keyboard, GitHub CI
- GitHub users: @sadafayubb, @sofusham, @DavidBayPedersen
- Main tasks: SPI controller, CPU (helping group 7)
- Secondary tasks: GPIO controller, PWM, & Timers
- GitHub users: Andreas - @AndreasSvarta, Rasmus - @McQueen24
- Main tasks: Interconnection fabric (i.e., memory arbiter, bus, memory mapping, etc.).
- Secondary tasks: Verification
- GitHub users: ArnĂłr - @Arn0r, Matthias - @mattm4r, Stephan - @StephanAAu.
- Main tasks: GPIO controller, PWM, & Timers
- Secondary tasks: Wildcat CPU integration, SPI controller
- GitHub users: Tobias - @Collinn, Mariana - @immarianaas, Andreas - @DreasL02.
- Main tasks: Off-chip SPI memory, Verification leader, GitHub CI
- Secondary tasks: Wildcat CPU integration, SPI controller
- GitHub users: Jacob - @jjdehl, Asger - @AsgerWenneb, Carl - @CarlVinten
- Main tasks: Memories (custom + existing), Chip toolchain leader
- Secondary tasks: GPIO controller, PWM, & Timers
- GitHub users: @schoeberl, @lucapezza
- Tasks: Specifications, coordination, repository structure, project planning
- Research UART communication requirements
- Use import @shoeberl core UART
- Define UART mapping and wrapper functionality
- Implement the module
- Integrate with system interconnect
- Test and debug UART communication
- Document usage and API
- Investigate SPI:
- Study the SPI protocol (e.g., clock polarity, phase)
- Check data width (normal/squad switch?) and speed
- Decide on Master or Slave Configuration
- Design SPI specifications:
- List input and output signals, as well as control signals
- Define register for storing receiver data (and maybe temporary registers for data transmission?)
- Decide on Error Handling
- Specify performance metrics (clock frequency, latency, e.g.,)
- Design Block Diagram (subsystems, datapaths, clk, and control paths):
- Design Register/Memory layout:
- Chisel Implementation:
- Verification:
- Testbenches (?)
- Analog tests
- Integrate into top-level system with "template" as specified under system integration
- Create tooling to run programs on hardware in simulations
- Integrate and coordinate with vital hardware components such as serial etc.
- Test hardware-based instruction loading and program execution, including the ability to use memory
- Design a "template" for every sub-implementation to follow
- For a top-level module interface
- For a unified API specification
- Ensure every project uses this format so everything can integrate with each other, potentially mock implementations at the beginning
- Allow test suites at different levels (hardware/software) and integrate with CI
- Tie together top-level module with sub-implementation interfaces
- Tie together top-level module and caravel interface
- Ensure continued development does not deviate from pre-established conventions and norms
- Find out how we want to invoke soc-dtu-2025 repo to actually build stuff e.i. do we keep caravel configuration in this repo and just use local ci invocation to use it with some monkey patching? Or is it even a good idea to use it as a submodule.
- Outline top level specifications and translate to caravel pin-out / pin config
- Implement build step that is compatible with rest of build process
-
Define interconnection protocol (PipeCon)
- Define amount of components and address space in collaboration with the groups
- Define IO interface (max 5000 ack-stalls)
-
Bridge CPU and chosen interfaces
-
Write bus logic in verilog
-
Create a testbench for read and write with different components
-
Please edit the address size for your respective device
- VGA: XX KB
- SPI: XX KB
- SPI: XX KB
- UART: XX KB
- Keyboard: XX KB
- Memory: XX KB
- GPIO, PWM: XX KB
- Research SPI communication requirements
- Determine off-chip memory type (USB,SD-card,...)
- Define SPI mapping and wrapper functionality
- Work with group 4 for a standardized protocol to talk to external memory
- Implement the external memory according to protocol
- Integrate with github continuous integration
- Test and debug SPI communication with the memory
- Document API and how to use
- Activity 1
- Activity 2
- Existing memory solution
- Selection of memory
- Simulation model
- Macro injection in openlane
- Custom memory
- Analog design
- Bitcell
- Write driver
- Sense amplifier
- (Precharger)
- Digital design
- Wordline decoder
- Write masks
- Two ports?
- Generator script
- Macro injection in openlane
- Power gating
- Verilog simulation model
- Analog tests
- Analog design
- Align groups on interfacing the toolchain
- Align with CI group
- Maintain config.json
- Implementation details
- Figure out what standard to use (USB or PS-2?)
- Bus connection (Should it be interrupt or polling based?)
- Parallel or serial connection?
- Do we have a character set and where is it stored?
- Do we have danish and english (Multible character sets or only one?)
- Own clock divider or from main clock (Do we have PLL?)
- Research PS-2
- Clock domain
- Data signal structure
- Existing implentations
- Is debouncing handled in the keyboard? Is shift and other modifiers handled in keyboard?
- Design block diagram
- Write testbench
- Implement
- Test on basys fpga?
- Research text-based vga protocol
- Colors?
- Character set?
- Rom or flash?
- RAM or VRAM?
- Character buffer
- Is fps fixed, and if so at what framerate?
- Resolution?
- Is writing to character buffer handled by the cpu or keyboard controller?
- General memory layout and implementation
- Block diagram
- Testbench
- Implementation
- Test on basys fpga?
- Investigate possibility of pullup and pulldown resistors
- Investigate how muxing between in/out should be handled
- Investigate possibility output driver configuration (pushpull, open drain)
- Investigate ESD protection necessity
- Design specification
- Design block diagram
- Design register/memory layout
- Design the wrapper for analog front-end
- Digital Hardware design
- Investigate possibility of interrupts for CPU
- Investigate how muxing between timers, pwm and output
- Investigate capability needs, i.e. counting up/down
- Investigate clocking and clock division
- Design specification
- Design block diagram
- Design register/memory layout
- Digital Hardware design
- Understand Specifications of SPI protocol
- How does the controller interact with the rest of the system (interrupts, registers)?
- Writing Testbench
- Understand the Wildcat CPU Design
- See how CPU connects to peripherals (SPI, GPIO, PWM, Timers)
- Testbenches and Simulations to confirm they work as expected
- Activity 1
- Activity 2
- Come up with verification plan
- Come up with a rough draft of a timeline of tests needed to be done
- Figure out success and failure criteria for each component
- Integrate with github actions to automate testing framework
- Integrate into CI on github
To be added.
- Be sure to initialize submodules with
git submodule update --init --recursive
or by cloning withgit clone --recurse-submodules
Download the correct binary based on your operating system (Linux only): https://github.com/riscv-collab/riscv-gnu-toolchain/releases/https://github.com/riscv-collab/riscv-gnu-toolchain/releases/.
This will typically be riscv64-elf-ubuntu-22.04-gcc-nightly-2025.01.20-nightly.tar.xz
or the Ubuntu 24.04 variant (depending on glibc/gcc version).
cd /tmp
wget https://github.com/riscv-collab/riscv-gnu-toolchain/releases/download/2025.01.20/riscv64-elf-ubuntu-22.04-gcc-nightly-2025.01.20-nightly.tar.xz
tar -xvf riscv64-elf-ubuntu-22.04-gcc-nightly-2025.01.20-nightly.tar.xz -C /opt
chmod +x /opt/riscv/bin/* # if this fails something went wrong
# For ease of use link directly to usr bin directory.
# OR add the previous folder to $PATH
# OR change the RISCV_PREFIX enviroment varible to /opt/riscv/bin/riscv64-unknown-elf
for file in /opt/riscv/bin/*; do
sudo ln -s "$file" /usr/bin/$(basename "$file")
done
- Wildcat CPU in ./wildcat