Skip to content

Commit 8a0a5cb

Browse files
committed
Dockerfile is added. Interface and its example is updated.
1 parent cde8dbd commit 8a0a5cb

File tree

15 files changed

+423
-100
lines changed

15 files changed

+423
-100
lines changed

MANIFEST.in

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,4 @@
11
include README.md
22
include README.rst
3+
include docker/Dockerfile
4+

Makefile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ all: clean
55
clean:
66
make clean -C ./veriloggen
77
make clean -C ./sample
8-
rm -rf *.pyc __pycache__ pycoram.egg-info build dist
8+
rm -rf *.pyc __pycache__ veriloggen.egg-info build dist
99

1010
.PHONY: release
1111
release:

README.md

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,22 @@ Requirements
3939
Installation
4040
==============================
4141

42+
On Docker
43+
------------------------------
44+
45+
Dockerfile is available, so that you can try Veriloggen on Docker without any installation on your host platform.
46+
47+
```
48+
cd docker
49+
sudo docker build -t user/veriloggen .
50+
sudo docker run --name veriloggen -i -t user/veriloggen /bin/bash
51+
cd veriloggen/sample/led/
52+
make
53+
```
54+
55+
On your host platform
56+
------------------------------
57+
4258
If you want to use Veriloggen as a general library, you can install on your environment by using setup.py.
4359

4460
If Python 2.7 is used,

README.rst

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,17 @@ If Python 3.x is used,
5959

6060
python3 setup.py install
6161

62+
Docker
63+
------
64+
65+
Dockerfile is available. Please try Veriloggen by using Dockerfile.
66+
67+
::
68+
69+
cd docker
70+
sudo docker build -t user/ubuntu:14.04-veriloggen .
71+
sudo docker run --name veriloggen -i -t user/ubuntu:14.04-veriloggen /bin/bash
72+
6273
Getting Started
6374
===============
6475

docker/Dockerfile

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
FROM ubuntu:14.04
2+
RUN apt-get update && apt-get upgrade -y
3+
RUN apt-get install build-essential -y
4+
RUN apt-get install git -y
5+
RUN apt-get install python python-pip python3 python3-pip -y
6+
RUN apt-get install iverilog gtkwave -y
7+
RUN apt-get install python-pygraphviz -y
8+
RUN pip install jedi epc virtualenv jinja2
9+
RUN pip3 install jedi epc virtualenv jinja2
10+
RUN mkdir /home/veriloggen/
11+
WORKDIR "/home/veriloggen"
12+
RUN git clone https://github.com/shtaxxx/Pyverilog.git
13+
RUN cd Pyverilog && python setup.py install && cd ../
14+
RUN cd Pyverilog && python3 setup.py install && cd ../
15+
RUN git clone https://github.com/shtaxxx/veriloggen.git
16+
RUN cd veriloggen && python setup.py install && cd ../
17+
RUN cd veriloggen && python3 setup.py install && cd ../

sample/bram/bram.py

Lines changed: 51 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -1,82 +1,82 @@
11
import sys
22
import os
3+
import collections
4+
35
from veriloggen import *
46

5-
def mkBramInterface(m, addrwidth, datawidth):
6-
addr = m.Input('addr', addrwidth)
7-
datain = m.Input('datain', datawidth)
8-
write = m.Input('write')
9-
dataout = m.Output('dataout', datawidth)
10-
return addr, datain, write, dataout
11-
12-
def mkBramUser(m, name, addrwidth, datawidth):
13-
addr = m.Reg(name + 'addr', addrwidth)
14-
datain = m.Reg(name + 'datain', datawidth)
15-
write = m.Reg(name + 'write')
16-
dataout = m.Wire(name + 'dataout', datawidth)
17-
return addr, datain, write, dataout
7+
class BramInterface(Interface):
8+
def __init__(self, m, prefix, postfix, addrwidth, datawidth, io=False):
9+
Interface.__init__(self, m, prefix, postfix, io)
10+
11+
self.addrwidth = self.Parameter('ADDR_WIDTH', addrwidth)
12+
self.datawidth = self.Parameter('DATA_WIDTH', datawidth)
13+
14+
In = self.Input if self.io else self.Reg # self.Wire
15+
Out = self.Output if self.io else self.Wire
16+
17+
self.addr = In('addr', addrwidth)
18+
self.datain = In('datain', datawidth)
19+
self.write = In('write')
20+
self.dataout = Out('dataout', datawidth)
1821

1922
def mkBram(name):
20-
m = Module(name + '_bram')
23+
m = Module(name + 'bram')
24+
2125
addrwidth = m.Parameter('ADDR_WIDTH', 10)
2226
datawidth = m.Parameter('DATA_WIDTH', 32)
27+
2328
clk = m.Input('CLK')
24-
addr, datain, write, dataout = mkBramInterface(m, addrwidth, datawidth)
25-
d_addr = m.Reg('d_' + addr.name, datawidth)
26-
mem = m.Reg('mem', datawidth, addrwidth)
29+
bramif = BramInterface(m, '', '', addrwidth, datawidth, io=True)
30+
31+
d_addr = m.Reg('d_' + bramif.addr.name, datawidth)
32+
mem = m.Reg('mem', datawidth, Int(2)**addrwidth)
2733

2834
m.Always(Posedge(clk))(
29-
If(write)( mem[addr](datain) ),
30-
d_addr(addr)
35+
If(bramif.write)( mem[bramif.addr](bramif.datain) ),
36+
d_addr(bramif.addr)
3137
)
32-
m.Assign(dataout(mem[d_addr]))
33-
38+
39+
m.Assign(bramif.dataout(mem[d_addr]))
40+
3441
return m
3542

36-
def mkUser(bram):
43+
def mkTop():
3744
m = Module('TOP')
3845
addrwidth = m.Parameter('ADDR_WIDTH', 10)
3946
datawidth = m.Parameter('DATA_WIDTH', 32)
4047
clk = m.Input('CLK')
4148
rst = m.Input('RST')
42-
addr, datain, write, dataout = mkBramUser(m, 'my_', addrwidth, datawidth)
49+
bramif = BramInterface(m, 'bram_', '', addrwidth, datawidth)
50+
51+
params = collections.OrderedDict()
52+
params.update(bramif.connectAllParameters())
4353

44-
params = ('ADDR_WIDTH', addrwidth), ('DATA_WIDTH', datawidth)
45-
ports = ('CLK', clk), ('addr', addr), ('datain', datain), ('write', write), ('dataout', dataout)
54+
ports = collections.OrderedDict()
55+
ports.update(clk.connect())
56+
ports.update(bramif.connectAllPorts())
57+
4658
m.Instance(bram, 'inst_bram', params, ports)
4759

48-
state = m.Reg('state', 32)
49-
50-
label = []
51-
label.append(m.Localparam('INIT' + str(len(label)), len(label)))
52-
53-
def cond(name='label'):
54-
ret = state == label[-1]
55-
label.append(m.Localparam(name + str(len(label)), len(label)))
56-
return ret
57-
58-
def goto_next():
59-
return state( state + 1 )
60-
60+
fsm = lib.FSM(m, 'fsm')
6161
m.Always(Posedge(clk))(
6262
If(rst)(
63-
addr(0), datain(0), write(0), state(0)
63+
bramif.addr(0), bramif.datain(0), bramif.write(0), fsm.next(0)
6464
).els(
65-
If(cond())( addr(0), datain(0), write(0), goto_next() ),
66-
If(cond())( write(1), datain(datain + 4), goto_next() ),
67-
If(cond())( write(0), goto_next() ),
68-
If(cond())(
69-
If(addr == 128)(
70-
addr(0), state(label[0])
65+
fsm( bramif.addr(0), bramif.datain(0), bramif.write(0), fsm.next() ),
66+
fsm( bramif.datain(bramif.datain + 4), fsm.next() ),
67+
fsm( bramif.write(0), fsm.next() ),
68+
fsm(
69+
If(bramif.addr == 128)(
70+
bramif.addr(0), fsm.next(0)
7171
).els(
72-
addr(addr + 1), state(label[1])
73-
)
74-
)))
72+
bramif.addr(bramif.addr + 1), fsm.next(1)
73+
))
74+
))
7575

7676
return m
7777

7878
#-------------------------------------------------------------------------------
79-
bram = mkBram('my')
80-
user = mkUser(bram)
81-
verilog = ''.join( (bram.toVerilog(), user.toVerilog()) )
79+
bram = mkBram('my_')
80+
top = mkTop()
81+
verilog = ''.join( (bram.toVerilog(), top.toVerilog()) )
8282
print(verilog)

sample/led-module/Makefile

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
TARGET=led.py
2+
ARGS=
3+
4+
PYTHON=python3
5+
#PYTHON=python
6+
#OPT=-m pdb
7+
#OPT=-m cProfile -s time
8+
#OPT=-m cProfile -o profile.rslt
9+
10+
.PHONY: all
11+
all: run
12+
13+
.PHONY: run
14+
run:
15+
$(PYTHON) $(OPT) $(TARGET) $(ARGS)
16+
17+
.PHONY: check
18+
check:
19+
$(PYTHON) $(OPT) $(TARGET) $(ARGS) > tmp.v
20+
iverilog -tnull -Wall tmp.v
21+
rm -f tmp.v
22+
23+
.PHONY: clean
24+
clean:
25+
rm -rf *.pyc __pycache__ parsetab.py *.out

sample/led-module/led.py

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
import sys
2+
import os
3+
from veriloggen import *
4+
5+
class Led(Module):
6+
def __init__(self, name='blinkled'):
7+
Module.__init__(self, name)
8+
self.width = self.Parameter('WIDTH', 8)
9+
self.clk = self.Input('CLK')
10+
self.rst = self.Input('RST')
11+
self.led = self.OutputReg('LED', self.width)
12+
self.count = self.Reg('count', 32)
13+
14+
self.Always(Posedge(self.clk))(
15+
If(self.rst)(
16+
self.count(0)
17+
).els(
18+
self.count(self.count + 1)
19+
))
20+
21+
self.Always(Posedge(self.clk))(
22+
If(self.rst)(
23+
self.led(0)
24+
).els(
25+
If(self.count == 1024 - 1)(
26+
self.led(self.led + 1)
27+
)
28+
))
29+
30+
#-------------------------------------------------------------------------------
31+
led = Led()
32+
verilog = led.toVerilog()
33+
print(verilog)
34+
35+
#-------------------------------------------------------------------------------
36+
expected_verilog = """
37+
module blinkled #
38+
(
39+
parameter WIDTH = 8
40+
)
41+
(
42+
input CLK,
43+
input RST,
44+
output reg [WIDTH-1:0] LED
45+
);
46+
reg [32-1:0] count;
47+
48+
always @(posedge CLK) begin
49+
if(RST) begin
50+
count <= 0;
51+
end else begin
52+
count <= count + 1;
53+
end
54+
end
55+
always @(posedge CLK) begin
56+
if(RST) begin
57+
LED <= 0;
58+
end else begin
59+
if(count == 1023) begin
60+
LED <= LED + 1;
61+
end
62+
end
63+
end
64+
endmodule
65+
"""
66+
67+
#from pyverilog.vparser.parser import VerilogParser
68+
#from pyverilog.ast_code_generator.codegen import ASTCodeGenerator
69+
#parser = VerilogParser()
70+
#expected_verilog_ast = parser.parse(expected_verilog)
71+
#codegen = ASTCodeGenerator()
72+
#expected_verilog_code = codegen.visit(expected_verilog_ast)
73+
74+
#print('// Sample Verilog code -> AST -> Verilog code')
75+
#print(expected_verilog_code)
76+
77+
#import difflib
78+
#diff = difflib.unified_diff(verilog.splitlines(), expected_verilog_code.splitlines())
79+
#print('\n'.join(list(diff)))

sample/led-module/veriloggen

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
../../veriloggen

0 commit comments

Comments
 (0)