68 lines
No EOL
3 KiB
Markdown
68 lines
No EOL
3 KiB
Markdown
## Circuit2Verilog Module
|
|
|
|
**Primary Contributors:**
|
|
|
|
1. James H - J Yeh, Ph.D.
|
|
2. Satvik Ramaprasad
|
|
|
|
## Introduction
|
|
|
|
This is an experimental module which generates verilog netlist (structural
|
|
verilog) given the circuit. Currently, the module generates fully functional
|
|
verilog code for basic circuits. For complex circuit, additional (manual) work
|
|
may need to be done in order to make it work. We are continuously improving this
|
|
module to work with more and more complex circuits.
|
|
|
|
|
|
# Algorithm
|
|
|
|
The basic algorithm is fairly straight forward. We have the circuit graph in
|
|
memory. We just need to convert this graph into verilog netlist. It is done by
|
|
performing a DFS on the circuit graph. The DFS involves the following steps
|
|
1. Creating verilog wires as and when required
|
|
2. Connecting verilog wires in element instantiations
|
|
|
|
## Some background information
|
|
The different sub circuits form a DAG (Directed Acyclic Graph) or dependency
|
|
graph. Each sub circuit itself (called scope internally) is actually a (cyclic)
|
|
graph on its own. Therefore the verilog generation is done in a 2 step DFS
|
|
approach. The first DFS is performed on the dependency graph. The second DFS is
|
|
done on individual sub circuit (scope).
|
|
|
|
## Code/Algorithm workflow
|
|
|
|
1. `exportVerilog()` - entry point
|
|
2. `exportVerilogScope()` - DFS(1) on Sub Circuits Dependency Graph
|
|
1. Set Verilog Labels for all elements
|
|
2. `generateHeader()` - Generates Module Header
|
|
3. `generateOutputList()` - Output Output List
|
|
4. `generateInputList()` - Generates Input List
|
|
5. `processGraph()` - DFS(2) on individual subcircuit/scope
|
|
1. DFS starts from inputs
|
|
2. Calls `processVerilog()` on all circuit elements (graph nodes) - resolves label names and adds neighbors to DFS stack.
|
|
3. Calls `generateVerilog()` on all circuit elements to get final verilog.
|
|
6. Generate Wire initializations
|
|
|
|
|
|
## Functions
|
|
**Verilog Module Functions:**
|
|
1. `verilog.exportVerilog()` - Entry point
|
|
1. `verilog.exportVerilogScope()` - Recursive DFS function on subcircuit graph
|
|
1. `verilog.processGraph()` - Iterative DFS function on subcircuit scope
|
|
1. `verilog.resetLabels()` - Resets labels in scope
|
|
1. `verilog.setLabels()` - Sets labels in scope
|
|
1. `verilog.generateHeader()` - Generates Verilog Module Header
|
|
1. `verilog.generateInputList()` - Generates Verilog Module Input List
|
|
1. `verilog.generateOutputList()` - Generates Verilog Module Output List
|
|
1. `verilog.sanitizeLabel()` - Sanitizes label for node/wire
|
|
1. `verilog.generateNodeName()` - Helper function to resolve node/wire name
|
|
|
|
**CircuitElement Functions:**
|
|
|
|
These functions can be overriden by derived classes.
|
|
|
|
1. `CircuitElement.prototype.processVerilog()` - Graph algorithm to resolve verilog wire labels
|
|
1. `CircuitElement.prototype.verilogName()` - Generate verilog name
|
|
1. `CircuitElement.prototype.generateVerilog()` - Generate final verilog code
|
|
1. `CircuitElement.prototype.verilogType` - Verilog type name
|
|
1. `CircuitElement.moduleVerilog` - Custom module verilog for elements |