ipynb 튜토리얼이 있긴 하다만,
언제까지나 ipynb 웹상에서 진행할 수는 없는 노릇이니,
Ubuntu 18.04 로컬상에서 Chisel 환경을 설치하고자 한다.
SBT가 뭔지도 모르고, 여러 모르는게 많다.
일단 오늘은 늦었으므로, 이해없이 환경셋업만 신속하게 끝내기로 했다.
완성되지 않은 하위항목은 다음에 시간이 날 때 채워넣기로 하자.
기존의 진도목표는
1. UCB Chisel-Tutorial
2. freechipsproject/chisel-bootcamp
였으나, @dhv2803e 님의 댓글로부터 아래 조언을 받았다.
Chisel 학습시 chisel-bootcamp도 너무 좋지만 옛날 자료라 아래 자료로 시작하는것을 추천합니다.
https://github.com/agile-hw/lectures/tree/main
책으로 보고 싶으시다면 이런 자료도 있습니다.
https://github.com/schoeberl/chisel-book
또한 Scala의 컬렉션을 활용한 함수형 프로그래밍에대해 공부해보는걸 추천합니다.
Array 형태로 배열된 모듈들 사이에 복잡한 connection이 필요할 경우 매우 유용합니다.
https://github.com/agile-hw/lectures/tree/main <- 본 자료의 10장~12장
https://www.youtube.com/watch?v=dbOi_Gboi_0
이후 추가 학습이 하고 싶다면
Chisel-bootcamp의 typeclass 파트를 읽어보는걸 추천합니다.
Chisel을 사용한다면 H/W Generator를 개발한다는 건데… 타입시스템을 구축해야할일이 종종 있으므로…
https://github.com/freechipsproject/chisel-bootcamp/blob/master/3.6_types.ipynb
https://www.chisel-lang.org/chisel3/docs/explanations/dataview.html#type-classes
Chisel 3.6.0+ 부터 툴체인에 큰 변화가 있어 이후 자료는 공식문서와 컨퍼런스 영상을 참고해보시면 좋습니다. (현재 6.0.0-M2 까지 출시됨)
Connection operator 부분에 다양한 연산자가 추가됨
Module Instantiation에 새로운 문법 추가(Definition, Instance)
Chisel 3.6.0 부터는 컴파일러가 MLIR-CIRCT(LLVM의 서브 프로젝트)로 변경
https://www.chisel-lang.org/chisel3/docs/introduction.html
https://javadoc.io/doc/org.chipsalliance/chisel_2.13/latest/index.html
https://github.com/freechipsproject/chisel-cheatsheet/releases/tag/3.6.0
https://www.youtube.com/@Chisel-lang
https://www.youtube.com/@chipsalliance8321
Chipyard는 RISC-V 기반 오픈소스 SoC 설계 프레임워크 입니다.
다양한 RISC-V 코어와 NoC Interconnect 같은걸 무료로 사용 할 수 있어서 참 좋죠
Rocket이나 Boom의 경우에는 Instruction 확장을 통해 coprocessor를 설계 할 수도 있습니다.
https://chipyard.readthedocs.io/en/stable/
https://www.youtube.com/@FireSimChipyard
curl -s "https://get.sdkman.io" | bash
구글링하면 curl은 쉽게 깔 수 있으므로, 생략한다.
Ubuntu에서 Scala를 sudo apt install scala하면, 2.11버전이 설치된다.
2.11버전은 ArrayDeque가 안되는 모양이라, 아예 새 버전을 sdk를 통해 설치하기로 했다.
출처
sdk install scala 2.13.11
출처: https://www.scala-sbt.org/release/docs/Installing-sbt-on-Linux.html
sdk install java $(sdk list java | grep -o "\b8\.[0-9]*\.[0-9]*\-tem" | head -1)
sdk install sbt
sbt
설치를 확인하고,
ctrl C를 쓰던 ctrl D를 쓰던 빠져나오자.
출처: https://github.com/ucb-bar/chisel-tutorial
git clone https://github.com/ucb-bar/chisel-tutorial.git
cd chisel-tutorial
git fetch origin
git checkout release
버클리 아니랄까봐 tex로 되어있어, 따로 make를 하여 pdf를 빌드해야한다.
우분투에서는 에러가 났으나, 맥에서는 정상작동하였다.
cd doc
make
open chisel-tutorial.pdf
목적: sbt가 제대로 깔렸는지 확인하기 위해서.
수행: Hello 라는 simple한 block을 생성하며, 이것은 success를 sbt로부터 출력할 것이고, PASSED 또한 testcase를 뚫었음을 표현하기 위해 출력한다.
참고: 처음 수행한다면, sbt가 자동적으로 Chisel3의 적절한 버전을 다운할 것이다.
// 경로: .../chisel-tutorial/
sbt run
ls
LICENSE.txt README.md build.sbt doc project run-examples.sh run-problem.sh run-solution.sh src target
에서,
ls
LICENSE.txt README.md build.sbt doc project run-examples.sh run-problem.sh run-solution.sh src target test_run_dir
즉, test_run_dir가 생성되었다.
아래 디렉토리를 가보면 fir라는 파일이 생성되었음을 알 수 있다. 이것에 대해서는 tutorial의 말미에 알아볼 것이다.
주어진 example을 실행하는 것으로 공부하기로 한다.
src/main/scala/problems에 exercise가 있고,
src/test/scala/problems에 해당 exercise의 functionality를 테스트할 수 있는 채점기가 있다.
src/main/scala/solutions에 정답이 있고,
src/test/scala/solutions에 정답의 functionality를 테스트할 수 있는 채점기가 있다.
보통 과제를 진행할 때, /main/~ 와 /test/~ 총 2개의 소스를 띄워놓고 작업하게 될 것이다.
참고로, sbt 실행에 약 10초 걸린다.
// 경로: .../chisel-tutorial/
sbt
sbt:src> test:runMain problems.Launcher Mux2
경로를 /src로 들어가서 실행했더니 에러떴는데, 덕분에 삽질 좀 했다.
제대로 돌면 이렇게 뜬다.
반면, Mux4는 과제코드가 완성안되었기 때문에 당연히 에러가 뜬다. 출처
The error you are reporting is for problems/Mux4.scala. Problems are supposed to fail. The purpose of the problems directory is to provide Chisel code examples that need changing in order to function correctly. You should edit your local copy of the code so that it passes the tests.
문제와 정답을 비교하면 아래와 같다.
Mux2인데, 이런 식으로 구현할 수 있구나 싶다.
그런데, val이면 바뀌지 않는 것으로 알고있는데, Module의 멤버변수가 val로 선언되어있다...?
엄.... 내 예상대로, 진짜 .text 영역에 적히는 literal로써의 상수가 아니라
setter없이 getter만 구현된 구조체로 구현되는게 아닌가 싶은데...
아니, java로 바뀔때 setter 없는 구조체라고 한다면, 결국 초기화는 1회로 그친다는점에는 변함없는데?
어떻게 wire 값 변화에 따라 즉시즉시 멤버변수값이 바뀌는거지...?
정리가 잘 된 글이네요. 도움이 됐습니다.