Pyverilog
Python-based Hardware Design Processing Toolkit for Verilog HDL
Install / Use
/learn @PyHDI/PyverilogREADME
Pyverilog
Python-based Hardware Design Processing Toolkit for Verilog HDL
Copyright 2013, Shinya Takamaeda-Yamazaki and Contributors
License
Apache License 2.0 (http://www.apache.org/licenses/LICENSE-2.0)
Publication
If you use Pyverilog in your research, please cite the following paper.
- Shinya Takamaeda-Yamazaki: Pyverilog: A Python-based Hardware Design Processing Toolkit for Verilog HDL, 11th International Symposium on Applied Reconfigurable Computing (ARC 2015) (Poster), Lecture Notes in Computer Science, Vol.9040/2015, pp.451-460, April 2015. Paper
@inproceedings{Takamaeda:2015:ARC:Pyverilog,
title={Pyverilog: A Python-Based Hardware Design Processing Toolkit for Verilog HDL},
author={Takamaeda-Yamazaki, Shinya},
booktitle={Applied Reconfigurable Computing},
month={Apr},
year={2015},
pages={451-460},
volume={9040},
series={Lecture Notes in Computer Science},
publisher={Springer International Publishing},
doi={10.1007/978-3-319-16214-0_42},
url={http://dx.doi.org/10.1007/978-3-319-16214-0_42},
}
What's Pyverilog?
Pyverilog is an open-source hardware design processing toolkit for Verilog HDL. All source codes are written in Python.
Pyverilog includes (1) code parser, (2) dataflow analyzer, (3) control-flow analyzer and (4) code generator. You can create your own design analyzer, code translator and code generator of Verilog HDL based on this toolkit.
Contribute to Pyverilog
Pyverilog project always welcomes questions, bug reports, feature proposals, and pull requests on GitHub.
for questions, bug reports, and feature proposals
Please leave your comment on the issue tracker on GitHub.
for pull requests
Please check "CONTRIBUTORS.md" for the contributors who provided pull requests.
Pyverilog uses pytest for the integration testing. When you send a pull request, please include a testing example with pytest. To write a testing code, please refer the existing testing examples in "tests" directory.
If the pull request code passes all the tests successfully and has no obvious problem, it will be merged to the develop branch by the main committers.
Installation
Requirements
- Python3: 3.7 or later
- Icarus Verilog: 10.1 or later
sudo apt install iverilog
- Jinja2: 2.10 or later
- PLY: 3.4 or later
pip3 install jinja2 ply
Optional installation for testing
These are required for automatic testing of tests. We recommend to install these testing library to verify experimental features.
- pytest: 3.8.1 or later
- pytest-pythonpath: 0.7.3 or later
pip3 install pytest pytest-pythonpath
Optional installation for visualization
These are required for graph visualization by dataflow/graphgen.py and controlflow/controlflow_analyzer.py.
- Graphviz: 2.38.0 or later
- Pygraphviz: 1.3.1 or later
sudo apt install graphviz
pip3 install pygraphviz
Install
Now you can install Pyverilog using setup.py script:
python3 setup.py install
Tools
This software includes various tools for Verilog HDL design.
- vparser: Code parser to generate AST (Abstract Syntax Tree) from source codes of Verilog HDL.
- dataflow: Dataflow analyzer with an optimizer to remove redundant expressions and some dataflow handling tools.
- controlflow: Control-flow analyzer with condition analyzer that identify when a signal is activated.
- ast_code_generator: Verilog HDL code generator from AST.
Getting Started
First, please prepare a Verilog HDL source file as below. The file name is 'test.v'. This sample design adds the input value internally whtn the enable signal is asserted. Then is outputs its partial value to the LED.
module top
(
input CLK,
input RST,
input enable,
input [31:0] value,
output [7:0] led
);
reg [31:0] count;
reg [7:0] state;
assign led = count[23:16];
always @(posedge CLK) begin
if(RST) begin
count <= 0;
state <= 0;
end else begin
if(state == 0) begin
if(enable) state <= 1;
end else if(state == 1) begin
state <= 2;
end else if(state == 2) begin
count <= count + value;
state <= 0;
end
end
end
endmodule
Code parser
Let's try syntax analysis. Please type the command as below.
python3 pyverilog/examples/example_parser.py test.v
Then you got the result as below. The result of syntax analysis is displayed.
Source: (at 1)
Description: (at 1)
ModuleDef: top (at 1)
Paramlist: (at 0)
Portlist: (at 2)
Ioport: (at 3)
Input: CLK, False (at 3)
Ioport: (at 4)
Input: RST, False (at 4)
Ioport: (at 5)
Input: enable, False (at 5)
Ioport: (at 6)
Input: value, False (at 6)
Width: (at 6)
IntConst: 31 (at 6)
IntConst: 0 (at 6)
Ioport: (at 7)
Output: led, False (at 7)
Width: (at 7)
IntConst: 7 (at 7)
IntConst: 0 (at 7)
Decl: (at 9)
Reg: count, False (at 9)
Width: (at 9)
IntConst: 31 (at 9)
IntConst: 0 (at 9)
Decl: (at 10)
Reg: state, False (at 10)
Width: (at 10)
IntConst: 7 (at 10)
IntConst: 0 (at 10)
Assign: (at 11)
Lvalue: (at 11)
Identifier: led (at 11)
Rvalue: (at 11)
Partselect: (at 11)
Identifier: count (at 11)
IntConst: 23 (at 11)
IntConst: 16 (at 11)
Always: (at 12)
SensList: (at 12)
Sens: posedge (at 12)
Identifier: CLK (at 12)
Block: None (at 12)
IfStatement: (at 13)
Identifier: RST (at 13)
Block: None (at 13)
NonblockingSubstitution: (at 14)
Lvalue: (at 14)
Identifier: count (at 14)
Rvalue: (at 14)
IntConst: 0 (at 14)
NonblockingSubstitution: (at 15)
Lvalue: (at 15)
Identifier: state (at 15)
Rvalue: (at 15)
IntConst: 0 (at 15)
Block: None (at 16)
IfStatement: (at 17)
Eq: (at 17)
Identifier: state (at 17)
IntConst: 0 (at 17)
Block: None (at 17)
IfStatement: (at 18)
Identifier: enable (at 18)
NonblockingSubstitution: (at 18)
Lvalue: (at 18)
Identifier: state (at 18)
Rvalue: (at 18)
IntConst: 1 (at 18)
IfStatement: (at 19)
Eq: (at 19)
Identifier: state (at 19)
IntConst: 1 (at 19)
Block: None (at 19)
NonblockingSubstitution: (at 20)
Lvalue: (at 20)
Identifier: state (at 20)
Rvalue: (at 20)
IntConst: 2 (at 20)
IfStatement: (at 21)
Eq: (at 21)
Identifier: state (at 21)
IntConst: 2 (at 21)
Block: None (at 21)
NonblockingSubstitution: (at 22)
Lvalue: (at 22)
Identifier: count (at 22)
Rvalue: (at 22)
Plus: (at 22)
Identifier: count (at 22)
Identifier: value (at 22)
NonblockingSubstitution: (at 23)
Lvalue: (at 23)
Identifier: state (at 23)
Rvalue: (at 23)
IntConst: 0 (at 23)
Dataflow analyzer
Let's try dataflow analysis. Please type the command as below.
python3 pyverilog/examples/example_dataflow_analyzer.py -t top test.v
Then you got the result as below. The result of each signal definition and each signal assignment are displayed.
Directive:
Instance:
(top, 'top')
Term:
(Term name:top.led type:{'Output'} msb:(IntConst 7) lsb:(IntConst 0))
(Term name:top.enable type:{'Input'} msb:(IntConst 0) lsb:(IntConst 0))
(Term name:top.CLK type:{'Input'} msb:(IntConst 0) lsb:(IntConst 0))
(Term name:top.count type:{'Reg'} msb:(IntConst 31) lsb:(IntConst 0))
(Term name:top.state type:{'Reg'} msb:(IntConst 7) lsb:(IntConst 0))
(Term name:top.RST type:{'Input'} msb:(IntConst 0) lsb:(IntConst 0))
(Term name:top.value type:{'Input'} msb:(IntConst 31) lsb:(IntConst 0))
Bind:
(Bind dest:top.count tree:(Branch Cond:(Terminal top.RST) True:(IntConst 0) False:(Branch Cond:(Operator Eq Next:(Terminal top.state),(IntConst 0)) False:(Branch Cond:(Operator Eq Next:(Terminal top.state),(IntConst 1)) False:(Branch Cond:(Operator Eq Next:(Terminal top.state),(IntConst 2)) True:(Operator Plus Next:(Terminal top.count),(Terminal top.value)))))))
(Bind dest:top.state tree:(Branch Cond:(Terminal top.RST) True:(
