1
Towards a Hardware DSL Ecosystem RubyRTL and Friends Jean-Christophe Le Lann Hannah Badier Florent Kermarrec Labsticc UMR CNR 6285 ENSTA Bretagne, France Enjoy Digital Landivisiau, France Labsticc UMR CNR 6285 ENSTA Bretagne, France HA HA FA a b cin sum cout a b sum cout HA b a b a sum cout sum cout FA a b cin cout sum FA a b cin cout sum etc... FA a b cin cout sum sum[0] sum[1] sum[n-1] cout b[0] a[0] 0 b[1] a[1] b[n-1] a[n-1] Ripple Carry Adder 1-bit full adder 1-bit half adder contact : [email protected] Future work Motivations Opening hardware and FPGA design to the Ruby community by providing an approachable DSL. Encouraging IP interchange between various hardware DSLs. . Exploring the practicality of metaprogramming and syntax maleability for open source hardware design. IP Interchange Objectives : translate IPs back and forth. Sexpir : new s-expression based interchange format. Experiments : Dump LiTeX IPs Translate Migen Verilog-oriented to RubyRTL VHDL Regenerate simple VHDL code : UART, etc Experimenting with larger designs Introducing multiple clocks RISC-V SoC, Regular Architectures like CGRA and MPPA. Open source class HalfAdder < Circuit end def initialize end input :a, :b output :sum, :cout assign( sum <= a^b ) assign( cout <= a & b ) Some of RubyRTL DSL keywords circuit halfAdder ... ... ... ... ... ... input a input b output sum output cout assign cout ... assign sum ... xor a b references are automatically linked DSL Abstract Syntax Tree (AST) and a b Metaprogramming Reexion Transformations Visitors VHDL code RubyRTL Compiler No dedicated parser, No Symtable Providing supplemental tools : visualization, animation, cycle-based simulation http://www.github.com/JC-LL/ruby_rtl http://www.github.com/JC-LL/sexpir http://www.github.com/enjoy-digital Why Ruby ? What is RubyRTL ? A new Ruby internal domain-specic language (DSL) for Hardware description, inspired by Python-based Migen DSLs are commonplace in Ruby Metaprogramming is easy "Ruby makes you Happy !" Yukihiro Matsumoto "Matz", creator of Ruby 松本行弘 work & poster licenced under "CC BY-NC-SA 3.0" input :a => nbits input :b => nbits output :sum => nbits output :cout # create components adders=[] for i in 0..nbits-1 adders << component("fa_#{i}"=>FullAdder) end # connect everything for i in 0..nbits-1 assign(adders[i].a <= a[i]) assign(adders[i].b <= b[i]) if i==0 assign(adders[0].cin <= 0) else assign(adders[i].cin<=adders[i-1].cout) end # nal sum assign(sum[i] <= adders[i].sum) end Generative descriptions a.k.a "generate statements in VHDL" using full Ruby class Counter < Circuit end def initialize end input :tick output :count => :byte sequential (:counting){ DSL If/Else If(tick==1){ } If(count==255){ } assign( count <= 0) Else { } assign( count <= count + 1) } clocked assignments {...} Ruby block clojures passed as method parameters Sequential Generic combinatorial input :go output :f => :bv2 fsm(:simple){ assign(f <= 0) state(:s0){ assign(f <= 1) If(go==1){ next_state :s1 } } state(:s1){ assign(f <= 2) next_state :s2 } state(:s2){ assign(f <= 3) next_state :s0 } } explicit DSL keywords for FSM S0 go!=1 S1 go==1 S2 FSM class FullAdder < Circuit end def initialize end input :a, :b, :cin output :sum, :cout assign( cout <= ha1.cout | ha2.cout ) component :ha1 => HalfAdder component :ha2 => HalfAdder assign( ha1.a <= a ) assign( ha1.b <= b ) assign( ha2.a <= cin ) assign( ha2.b <= ha1.sum ) assign( sum <= ha2.sum ) Component Re-use Pointed notation components Much more... automatic type conversion enum/struct/array types typedef :cplx => Record(:re=>:int16,:im=>int16) typedef :cplx_ary => Array(256, :cplx) wire :mem => :cplx_ary (0..255).each{ assign(mem[i] <= {re:i i, im: i*2} } puts mem[21][:im] # prints 42 wire a => :bit wire w => :int8 assign( w <= a + 5 ) (cumbersome in VHDL) e.g experimental

Jean-Christophe Le Lann Hannah Badier Florent Kermarrec

  • Upload
    others

  • View
    2

  • Download
    0

Embed Size (px)

Citation preview

Towards a Hardware DSL Ecosystem RubyRTL and Friends

Jean-Christophe Le Lann Hannah Badier Florent KermarrecLabsticc UMR CNR 6285ENSTA Bretagne, France

Enjoy DigitalLandivisiau, France

Labsticc UMR CNR 6285ENSTA Bretagne, France

HA

HA

FA

a

b

cin

sum

cout

ab

sum

cout

HA

b

a b

a

sum

cout

sum

cout

FAa b

cincoutsum

FAa b

cincoutsum

etc...FAa b

cincoutsum

sum[0]sum[1]sum[n-1]

cout

b[0]a[0]

0

b[1]a[1]b[n-1]a[n-1]

Ripple CarryAdder

1-bit full adder

1-bit half adder

contact : [email protected]

Future work

Motivations

Opening hardware and FPGA design to the Ruby community by providing an approachable DSL.

Encouraging IP interchange between various hardware DSLs. .

Exploring the practicality of metaprogramming and syntax maleability for open source hardware design.

IP Interchange

Objectives : translate IPs back and forth.

Sexpir : new s-expression based interchange format.

Experiments :

Dump LiTeX IPs

Translate Migen Verilog-oriented to RubyRTL VHDL

Regenerate simple VHDL code : UART, etc

Experimenting with larger designs

Introducing multiple clocks

RISC-V SoC, Regular Architectures like CGRA and MPPA.

Open source

class HalfAdder < Circuit

end

def initialize

end

input :a, :boutput :sum, :cout

assign( sum <= a^b )assign( cout <= a & b )

Some of RubyRTLDSL keywords

circuit halfAdder ... ... ... ... ... ...

input a input b output sum output cout assign cout ... assign sum ...

xor a breferences

are automatically linked

DSL Abstract Syntax Tree (AST)

and a b

Metaprogramming Reflexion

Transformations Visitors

VH

DL

code

RubyRTL Compiler

No dedicated parser, No Symtable

Providing supplemental tools :

visualization, animation, cycle-based simulation

http://www.github.com/JC-LL/ruby_rtl

http://www.github.com/JC-LL/sexpir

http://www.github.com/enjoy-digital

Why Ruby ?What is RubyRTL ?

A new Ruby internal domain-specific language (DSL)for Hardware description,

inspired by Python-based Migen

DSLs are commonplace in Ruby Metaprogramming is easy"Ruby makes you Happy !" Yukihiro Matsumoto

"Matz", creator of Ruby

松本行弘

work & posterlicenced under

"CC BY-NC-SA 3.0"

input :a => nbits input :b => nbits output :sum => nbits output :cout

# create components adders=[] for i in 0..nbits-1 adders << component("fa_#{i}"=>FullAdder) end

# connect everything for i in 0..nbits-1 assign(adders[i].a <= a[i]) assign(adders[i].b <= b[i]) if i==0 assign(adders[0].cin <= 0) else assign(adders[i].cin<=adders[i-1].cout) end # final sum assign(sum[i] <= adders[i].sum) end

Generative descriptions a.k.a

"generate statements in VHDL"using full Ruby

class Counter < Circuit

end

def initialize

end

input :tick

output :count => :byte

sequential (:counting){

DSL If/Else

If(tick==1){

}

If(count==255){

}assign( count <= 0)

Else {

}assign( count <= count + 1)

}

clockedassignments

{...} Ruby block clojures passed as method

parameters

Sequential

Generic

combinatorial

input :go output :f => :bv2 fsm(:simple){ assign(f <= 0) state(:s0){ assign(f <= 1) If(go==1){ next_state :s1 } } state(:s1){ assign(f <= 2) next_state :s2 } state(:s2){ assign(f <= 3) next_state :s0 } }

explicit DSL keywordsfor FSM

S0 go!=1

S1

go==1

S2

FSM

class FullAdder < Circuit

end

def initialize

end

input :a, :b, :cin

output :sum, :cout

assign( cout <= ha1.cout | ha2.cout )

component :ha1 => HalfAddercomponent :ha2 => HalfAdder

assign( ha1.a <= a )

assign( ha1.b <= b )

assign( ha2.a <= cin )

assign( ha2.b <= ha1.sum )

assign( sum <= ha2.sum )

Component Re-use

Pointed notation

components

Much more...

automatic type conversion

enum/struct/array types

typedef :cplx => Record(:re=>:int16,:im=>int16)

typedef :cplx_ary => Array(256, :cplx)

wire :mem => :cplx_ary

(0..255).each{ assign(mem[i] <= {re:i i, im: i*2} }

puts mem[21][:im] # prints 42

wire a => :bitwire w => :int8assign( w <= a + 5 )

(cumbersome in VHDL)

e.g experimental