29
RTL design in python: porting the mMIPS Jos Huisken June 25 th , 2013

RTL design in python: porting the mMIPS

  • Upload
    iram

  • View
    50

  • Download
    1

Embed Size (px)

DESCRIPTION

RTL design in python: porting the mMIPS. Jos Huisken June 25 th , 2013. What is Python?. What is Python?. A general purpose programming language Growing in popularity Interpreted language ( bytecode -interpretive) Multi -paradigm Clean object-oriented - PowerPoint PPT Presentation

Citation preview

Page 1: RTL  design in  python: porting the  mMIPS

RTL design in python:

porting the mMIPS

Jos HuiskenJune 25th, 2013

Page 2: RTL  design in  python: porting the  mMIPS

What is Python?

Page 3: RTL  design in  python: porting the  mMIPS

What is Python?• A general purpose programming language • Growing in popularity• Interpreted language (bytecode-interpretive)• Multi-paradigm

• Clean object-oriented• Functional – in the LISP tradition• Structural (procedural-imperative)

• Extremely readable syntax• Very high-level

• Lists• Dictionaries (associative arrays)

• Extensive documentation

Page 4: RTL  design in  python: porting the  mMIPS

What is MyHDL?

• A Python package which enables hardware description • Open-source project• Batteries included (more on this later)

Page 5: RTL  design in  python: porting the  mMIPS

MyHDL Extends Python• MyHDL is Python• Using Python constructs to extend• Object Oriented

• Signal, intbv• Generators

• Micro-thread like, enables concurrency behavior• Resumable functions that maintain state

• Decorators• Meta-programming• “Macro” mechanism• Modifies a function / generator• @always_seq and @always_comb

Page 6: RTL  design in  python: porting the  mMIPS

Why use MyHDL• Manage Complex Designs• New to Digital Hardware Design• Scripting Languages Intensively Used• Modern Software Development Techniques for Hardware

Design• Algorithm Development and HDL Design in a Single

Environment• Require Both Verilog and VHDL• VHDL Too Verbose• SystemVerilog Too Complicated• You Been TCL’d too much

Page 7: RTL  design in  python: porting the  mMIPS

What MyHDL is NOT• Not arbitrary Python to silicon• Not a radically new approach• Not a synthesis tool• Not an IP block library• Not only for implementation• Not well suited for accurate time simulation

Page 8: RTL  design in  python: porting the  mMIPS

Register Transfer

• Register Transfer Level (RTL) abstraction• This is the commonly excepted description of

mainstream HDLs: Verilog and VHDL• Describes the operations between registers

• MyHDL operates at the Register Transfer Level (RTL)

• MyHDL extends Python for hardware description

Page 9: RTL  design in  python: porting the  mMIPS

MyHDL Types• intbv• Bit vector type, an integer with bit vector properties

• Signal• Deterministic communication, see it as a VHDL signal

• Convertible types• intbv• bool• int • tuple of int• list of bool and list of intbv

Page 10: RTL  design in  python: porting the  mMIPS

MyHDL Generators• A Python generator is a resumable function

• Generators are the core of MyHDL• Provide the similar functionality as a VHDL process or

Verilog always block• yield in a generator

Page 11: RTL  design in  python: porting the  mMIPS

Python generator: Fibonacci 7 # function version

8 def fibon(n):

9 a = b = 1

10 result = []

11 for i in xrange(n):

12 result.append(a)

13 a, b = b, a + b

14 return result

15fibon(8)

16[1, 1, 2, 3, 5, 8, 13, 21]

7 # generator version

8 def fibon(n):

9 a = b = 1

10 result = []

11 for i in xrange(n):

12 yield a

13 a, b = b, a + b

14for x in fibon(8):

15 print x,

161 1 2 3 5 8 13 21

Page 12: RTL  design in  python: porting the  mMIPS

MyHDL Decorators• MyHDL Decorators“creates ready-to-simulate generators from local function definitions”

• @instance• @always(sensitivity list)• @always_seq(clock,reset)• @always_comb

Page 13: RTL  design in  python: porting the  mMIPS

Python decorator7 @mydecorator

8 def myfunc():9 return

10# is equivalent to

11def myfunc():12 return

13myfunc = mydecorator(myfunc)

7 def verbose(origfunc):8 # make new func

9 def newfunc(*args, **kwargs):10 print “entering”,

origfunc.__name__

11 origfunc(*args, **kwargs)

12 print “exiting”, origfunc.__name__

13 return newfunc

14@verbose

15def myfunc(s):16 print s

17myfunc(‘hoi’)

18entering myfunc

19hoi

20exiting myfunc

A decorator is a function (mydecorator) that takes a function object as an argument, and returns a function object as a return value.

@mydecorator: just syntactic sugar

Page 14: RTL  design in  python: porting the  mMIPS

MyHDL Flow

Page 15: RTL  design in  python: porting the  mMIPS

MyHDL Conversion• MyHDL has a convertible subset• Convert to Verilog• Convert to VHDL

• Pragmatic

• Standard FPGA / ASIC flow after conversion

Page 16: RTL  design in  python: porting the  mMIPS

Anatomy of a MyHDL Module

Page 17: RTL  design in  python: porting the  mMIPS

Simple adder in myhdl

Page 18: RTL  design in  python: porting the  mMIPS

A register

Page 19: RTL  design in  python: porting the  mMIPS

ALU waveform, using gtkwave

Page 20: RTL  design in  python: porting the  mMIPS

Verilog co-simulation• Icarus Verilog• Cadence ncsim• Cadence ncsim, CMOS90 netlist

Select icarus/verilog implementation:

Page 21: RTL  design in  python: porting the  mMIPS

Single cycle mini-mini MIPS Multi cycle mini MIPS

mMIPS in MyHDL

……

Page 22: RTL  design in  python: porting the  mMIPS

Ecosystem

import pylabimport matplotlib

Page 23: RTL  design in  python: porting the  mMIPS

Digital Filter

Page 24: RTL  design in  python: porting the  mMIPS

IIR Type I Digital Filter1 def m_iir_type1(clock,reset,x,y,ts,B=None,A=None):2 # make sure B and A are ints and make it a ROM (tuple of ints)3 b0,b1,b2 = map(int,B)4 a0,a1,a2 = map(int,A)56 ffd = [Signal(intbv(0, min=x.min, max=x.max)) for ii in (0,0)]7 fbd = [Signal(intbv(0, min=x.min, max=x.max)) for ii in (0,0)]8 # intermidiate result, resize from here9 ysop = Signal(intbv(0, min=dmin, max=dmax))1011 @always_seq(clock.posedge, reset=reset)12 def hdl():13 if ts:14 ffd[1].next = ffd[0]15 ffd[0].next = x1617 fbd[1].next = fbd[0]18 fbd[0].next = ysop//Am # truncate (>>)1920 # extra pipeline on the output at clock21 ysop.next = (b0*x) + (b1*ffd[0]) + (b2*ffd[1]) - \22 (a1*fbd[0]) - (a2*fbd[1])23 24 # truncate to the output word format25 y.next = ysop//Am # truncate (>>)2627 return hdl

Page 25: RTL  design in  python: porting the  mMIPS

Simulation

Page 26: RTL  design in  python: porting the  mMIPS

Conclusion• Python

• Easy to learn• Batteries included

• MyHDL• Hardware description in Python• Powerful environment, ecosystem• Verification simplified and fun

• mMIPS• Ported from SystemC• Simulated and Co-Simulated, not fully verified• Synthesized: ISE (untested) and Cadence rc (co-simulated)

• Python: allows (…) matlab style interaction

Page 27: RTL  design in  python: porting the  mMIPS

Short MyHDL History• Jan Decaluwe• Creator of MyHDL• Founder & Board Member

Easic• Created MyHDL between

2002-2003

• First Release on SourceForge Sep 30, 2003

www.programmableplanet.com

MyHDL ASIChttp://www.jandecaluwe.com/hdldesign/digmac.html

Page 28: RTL  design in  python: porting the  mMIPS

Acknowledgement• You guys• for hosting and providing the mMips

• Christopher Felton• Several slides came from him!