Slide 1

Slide 1 text

ChiselͱFIRRTLͷ͔ͨΘΕ࣌ @muo_jp(ͳ͔͟Θ ͚͍) 2016/09/25, RTLΛޠΔձ(12)

Slide 2

Slide 2 text

@muo_jp ιϑτ΢ΣΞാ (C#, Java, Python, TypeScriptํ໘) εϚʔτϑΥϯ޲͚ΞϓϦ WebαʔϏε C#޷͖

Slide 3

Slide 3 text

ߴҐ߹੒͕੝Γ্͕ͬͯ ͍Δࡢࠓ

Slide 4

Slide 4 text

ιϑτ΢ΣΞ։ൃऀ΋ߴҐ߹੒͋Ε͹ ϋʔυ͍͚ΔΜ͡Όͳ͍ͷͱ͍͏෩ை

Slide 5

Slide 5 text

ߴҐ߹੒ܥͪΐͬͱ… ϕϯμʔʹϩοΫΠϯ͞Εͨ͘ͳ͍ ※Vivado HLSͰॻ͍ͯAͷੴʹͿͪࠐΉͱ͔ͪΐͬͱ SystemC΋OpenCL΋νϥݟͯ͠řƂŖͱͳͬͨ ํݴΛؤுֶͬͯͿKIAI͕଍Γͳ͔ͬͨ ͑ͬɺA++!?!? ֤छϕϯμʔඇґଘߴҐ߹੒ܥ(Synthesijer, PyCoRAM, Polyphony, Synverll, IROHAํ໘)͸ԕר͖ʹோΊͯ·͢

Slide 6

Slide 6 text

݁Ռ

Slide 7

Slide 7 text

ਖ਼߈๏ͰHDLΛษڧ RTLํ໘ͷํʹ͸ৗ͚ࣝͩͲ ιϑτ΢ΣΞॻ͍͍ͯͯ΋஌ Βͳ͍ॾʑΛֶΜͰελʔτ ஍఺·Ͱདྷͨ ϝλεςʔϒϧݱ৅ άϨΠίʔυ VHDL΋ා͘ͳ͘ͳͬͨ HDLʹΑΔߴੑೳσΟδλϧճ࿏ઃܭ
 ʢ৿Ԭ ੅෉ ஶɺ2007೥2݄ ୈ4൛/
 2012೥7݄ ిࢠ൛ ॳ൛ൃചɺCQग़൛ࣾʣ

Slide 8

Slide 8 text

Chisel https://chisel.eecs.berkeley.edu/ UC Berkeleyͷݚڀάϧʔϓ࡞ (2012-) ScalaͰRTLهड़ ࣮ࡍͷར༻ྫ RISC-V࣮૷ͷRocket Chip

Slide 9

Slide 9 text

Chisel (Chisel 2)ͷߏ଄ Chiselຊମ(֤छܕఆٛΛఏڙ) RTLίʔυ (ChiselྲّྀͷScala) ςετίʔυ (Scala) ίʔσΟϯάϑΣʔζ

Slide 10

Slide 10 text

Chisel (Chisel 2)ͷߏ଄ ChiselϥϯλΠϜ RTLίʔυ (ChiselྲّྀͷScala) ςετίʔυ (Scala) ࣮ߦϑΣʔζ .vϑΝΠϧ .cppϑΝΠϧˠωΠςΟϒόΠφϦ ϑΝΠϧੜ੒ cycle-accurateͳςετ

Slide 11

Slide 11 text

Chisel≠ߴҐ߹੒ܥ

Slide 12

Slide 12 text

Chisel͸... εςʔτϚγϯͷࣗಈίϯύΠϧͳͲͯ͘͠Εͳ͍ ίʔυ͸ScalaͰॻ͕͘ɺ͋͘·Ͱ΋ճ࿏ੜ੒ίʔυ Λলྗهड़͢Δ΋ͷ

Slide 13

Slide 13 text

Chiselͷྑ͍ͱ͜Ζ IntelliJ IDEAͷࢧԉΛϑϧʹड͚ͭͭRTLίʔυΛॻ͚Δ γϯϘϧ໊ͷޡΓɺԋࢉʹ͓͚ΔܕෆҰகΛ͖ͬͪΓ ϦΞϧλΠϜͰԡ͑ͯ͘͞ΕΔɻϦϑΝΫλ΋ڧ͍ ௨ৗͷScalaίʔυͰγϛϡϨʔγϣϯ݁ՌΛݕূͰ͖Δ ग़ྗ͕Verilog HDLͳͷͰ͋ͪͪ͜΁࣋ͪग़͠΍͍͢ macOS/Windows/Linux্Ͱॻ͚Δ (େࣄ!)

Slide 14

Slide 14 text

ChiselͰॻ͍ͯMAX10΁

Slide 15

Slide 15 text

Chiselίʔυྫ(TMDSม׵ ൈਮ)

Slide 16

Slide 16 text

Simݕূίʔυ

Slide 17

Slide 17 text

Simݕূίʔυ

Slide 18

Slide 18 text

ScalaͬΆ͘ͳ͍͚ͲScalaͩ

Slide 19

Slide 19 text

ଞͷAlt-HDL(ࢀߟ) SFL(Structured Function description Language) ࢀߟ: https://ja.wikipedia.org/wiki/SFL Spinal HDL http://spinalhdl.github.io/SpinalDoc/ ChiselʹΩϨͨਓ͕࡞Γ࢝ΊͨΠϯεύΠΞܥ ϚϧνΫϩοΫαϙʔτڧ͍ɺεςʔτϚγϯهड़ࢧԉ͋Γ (ࣗಈతʹ੾ͬͯ͘ΕΔΘ͚Ͱ͸ͳ͍)

Slide 20

Slide 20 text

HDLੜ੒؀ڥʹ๬Ή΋ͷ ϚϧνϓϥοτϑΥʔϜαϙʔτ(macOS/Windows) ࣗ༝Ͱ྿Ձʹ࢖͑ͯࣗ༝ʹࣺͯΒΕΔ ϩοΫΠϯ, ϊʔαϯΩϡʔ. ΤσΟλαϙʔτ͕ڧ͍ ϗετݴޠͰςετΛॻ͍ͯγϛϡϨʔγϣϯݕূ

Slide 21

Slide 21 text

Chisel 2 → Chisel 3

Slide 22

Slide 22 text

Chisel 3ͷ ίʔσΟϯάϑΣʔζ Chiselຊମ(֤छܕఆٛΛఏڙ) RTLίʔυ (ChiselྲّྀͷScala) ςετίʔυ (Scala)

Slide 23

Slide 23 text

ωΠςΟϒόΠφϦ Chisel 3ͷ࣮ߦϑΣʔζ ChiselϥϯλΠϜ RTLίʔυ (ChiselྲّྀͷScala) ςετίʔυ (Scala) FIRRTL Verilator .fir .v cycle-accurateͳςετ

Slide 24

Slide 24 text

FIRRTL(ݴޠɾπʔϧڞ༻໊)

Slide 25

Slide 25 text

FIRRTLͷݴޠ࢓༷ https://www2.eecs.berkeley.edu/Pubs/TechRpts/2016/ EECS-2016-9.pdf 50ϖʔδগʑ ·͋·͋෼͔Γ΍͍͢

Slide 26

Slide 26 text

FIRRTLΛखॻ͖ͯ͠ΈΔ circuit Top : module HalfAdder : input clk : Clock input reset : UInt<1> input io_a : UInt<1> input io_b : UInt<1> output io_s : UInt<1> output io_c : UInt<1> skip io_s <= xor(io_a, io_b) io_c <= and(io_a, io_b) module Top : input clk : Clock input reset : UInt<1> inst halfAdder of HalfAdder halfAdder.io_a is invalid halfAdder.io_b is invalid halfAdder.clk <= clk halfAdder.reset <= reset

Slide 27

Slide 27 text

FIRRTLΛखॻ͖ͯ͠Έͨ circuit͸ඞਢɺTop Level Module΋ඞਢ ػցతʹίʔυੜ੒͠΍ͦ͢͏ͳงғؾ͸͋Δ rocket.firΛಡΜͰΈΔͱɺϗετͱͷσόοά༻௨৴ͳͲΛຒΊͯΔ ৴߸Λ֎΁ग़ͯ͠σόοά͠΍͘͢͢Δͷ͸FIRRTLੜ੒ଆͷ੹೚? Chiselͷଞݴޠ൛Λ࡞࣮ͬͯ༻ΤϦΞ·Ͱ͍࣋ͬͯ͘ͷ͕໘౗ͦ͏ ͤΊͯඪ४ͷDUT௨৴ํ๏ΛܾΊ͓͍ͯͯ΄͍͠

Slide 28

Slide 28 text

ͦΕ͸ͦ͏ͱ

Slide 29

Slide 29 text

C#͕޷͖ (※ຊ୊)

Slide 30

Slide 30 text

FIRRTLͷͬ͘͟Γ࢓༷ ϑϧ൛ͱαϒηοτ൛(LoFIRRTL) ग़ྗλʔήοτ͸ओʹVerilog HDL ੜ੒ͨ͠Verilog HDLίʔυΛVerilator΁৯ΘͤͯC++ ΁ม׵͢Δ

Slide 31

Slide 31 text

FIRRTLͷC#ϑϩϯτΤϯυ Λ࡞ͬͨ

Slide 32

Slide 32 text

class HalfAdder : Module { public HalfAdder() { var io = new { a = new UInt(isOut: false), b = new UInt(isOut: false), s = new UInt(isOut: true), c = new UInt(isOut: true) }; this.io = io; io.s.Assign(io.a + io.b); io.c.Assign(io.a ^ io.b); } } public class AdderGenerator { public static void Main() { FirrtlSharp.Generator.GenerateHDL(new HalfAdder()); } }

Slide 33

Slide 33 text

... module HalfAdder( input clk, input reset, input io_a, input io_b, output io_s, output io_c ); assign io_s = io_a & io_b; assign io_c = io_a ^ io_b; endmodule module TopHalfAdder( input clk, input reset ); wire halfadder_clk; wire halfadder_reset; ...

Slide 34

Slide 34 text

DEMO

Slide 35

Slide 35 text

FIRRTL ྑ͍ͱ͜Ζ ΍͸ΓػցతʹίʔυΛੜ੒͠΍͍͢ (High)FIRRTL→LoFIRRTLͷม׵εςοϓΛࠁΜͰ͍͚ Δ Verilog HDLΛੜ੒ͯ࢝͠ΊͯΤϥʔు͘ Ͱ͸ͳ͍ sourcemapͷ࢓૊ΈΛ͍࣋ͬͯΔ

Slide 36

Slide 36 text

FIRRTL ඍົͳͱ͜Ζ daemonϞʔυ͕ͳ͍ ϓϩηεىಈׂ͕ͱॏ͍ͷͰຖճىಈ͸ͨ͘͠ͳ͍ ϦΞϧλΠϜʹ͍ۙΤϥʔใࠂΛग़͍ͨ͠৔߹͸ঘߋ ϓϩηεؒ࿈ܞ͕͕ͬͭΓςΩετ? FIRRTLͷग़ྗΛparse͢Δͷ͸ෆໟ protobufͱ͔ɺͤΊͯJSONͰσʔλ࿈ܞͰ͖ͯ΄͍͠(ଟ෼ௐ΂͖ Εͯͳ͍͚ͩͰԿ͔͋Δ)

Slide 37

Slide 37 text

FIRRTL#ࢼ࡞൛ ྑ͍ͱ͜Ζ ֤ioϙʔτͷೖྗΛΤσΟλͰָʹิ׬Ͱ͖Δ ͦΕͳΓʹ؆ܿͳه๏ͰVerilog HDLΛੜ੒Ͱ͖Δ ஍ຯʹsourcemapαϙʔτͨ͠ ʮVerilog HDLม׵͕ίέͯΔ͜ͷίʔυɺ
 ɹC#ίʔυ֘౰Օॴ͸ͩ͜͜Αʯػೳ

Slide 38

Slide 38 text

FIRRTL#ࢼ࡞൛ ࢒೦ͳͱ͜Ζ

Slide 39

Slide 39 text

(C#ͷ)syntaxతͳࣄ৘ C#͸ϝιουݺͼग़͠΍incr/decrݺͼग़͠ͳͲΛߦ Θͳ͍ࣜͷΈͰจΛߏ੒ͤͯ͘͞Εͳ͍ io.s <= io.a + io.b;
 ͱ͍͏ه๏͸<=ͷԋࢉࢠΦʔόʔϩʔυͰ͸ϜϦ ݁Ռɺio.s.Assign(...)ͱ͍͏൵͍͠ײ͡ʹͳͬͨ

Slide 40

Slide 40 text

ࢼ࡞൛ͷ࣮૷໘(ࢼ࡞ͳͷͰ...) ࢒೦͕ൽΛඃͬͯΪϦΪϦಈ͍ͯΔ͙Β͍࢒೦ͷմ ςετػೳ΋౰વະ࣮૷ͩ͠ ΰϦԡ͠ίʔυͷҰ෦Λ͝ཡ͍ͩ͘͞ UIntҎ֎ͷܕΛ׬શແࢹ ioҎ֎ͷreg/wireΛແࢹ ৚݅෼ذΛແࢹ

Slide 41

Slide 41 text

݁࿦

Slide 42

Slide 42 text

ṷ͸ṷ԰ɻDSLΛ࡞ΔͳΒɺ ޲͍ͨݴޠͰ΍Ζ͏ˠScala