在 Rocket Chip 上挂接 TLRAM

最近遇到一个需求,需要在 Rocket Chip 里面开辟一块空间,通过 verilog 的 $readmemh 来进行初始化而不是用 BootROM ,这样每次修改内容不需要重新跑一次 Chisel -> Verilog 的流程。然后到处研究了一下,找到了解决的方案: 首先是新建一个 TLRAM 然后挂接到 cbus 上: import freechips.rocketchip.tilelink.TLRAM import freechips.rocketchip.tilelink.TLFragmenter import freechips.rocketchip.diplomacy.LazyModule import freechips.rocketchip.diplomacy.AddressSet trait HasTestRAM { this: BaseSubsystem => val testRAM = LazyModule( new TLRAM(AddressSet(0x40000000, 0x1FFF), beatBytes = cbus.beatBytes) ) testRAM.node := cbus.coupleTo("bootrom") { TLFragmenter(cbus) := _ } } 这里的地址和大小都可以自由定义。然后添加到自己的 Top Module 中: class TestTop(implicit p:Parameters) extends RocketSystem // ... with HasTestRAM //... { overide lazy .

Read More

体验 Tencent Kubernetes Engine

之前在机器上试验了一下 kubernetes,感觉挺不错的,所以就想把腾讯云上面的机器也交给 kubernetes 管理。找到容器服务,新建集群,选择模板里的标准托管集群就可以了。然后开启下面的公网访问,设置一个比较小的 IP 地址段,按照页面下面的要求合并一下 kube config(因为还有别的 k8s cluster): $ KUBECONFIG=~/.kube/config:/path/to/new/config kubectl config view --merge --flatten > new_config $ cp new_config ~/.kube/config 覆盖之前先确认原来的配置还在,然后就可以用 kubectl 切换到新的 context: $ kubectl config get-contexts $ kubectl config use-context new-context-here $ kubectl get node NAME STATUS ROLES AGE VERSION 172.21.0.17 Ready <none> 75m v1.16.3-tke.3 可以看到我们的 k8s node 已经上线了。我一般习惯先配好 kubernetes-dashboard: $ kubectl create -f https://raw.githubusercontent.com/cilium/cilium/v1.6/install/kubernetes/quick-install.yaml $ kubectl proxy & $ kubectl -n kubernetes-dashboard describe secret (kubectl -n kubernetes-dashboard get secret | grep admin-user | awk '{print \$1}') | tail -n1 | awk '{print \$2}' | pbcopy 然后在浏览器里访问 http://localhost:8001/api/v1/namespaces/kubernetes-dashboard/services/https:kubernetes-dashboard:/proxy/#/overview?

Read More

在 Kubernetes 集群上部署 gitlab—runner

按照 GitLab 上的教程试着把 gitlab-runner 部署到 k8s 集群上,发现异常地简单,所以简单做个笔记: 编辑 values.yaml gitlabUrl: GITLAB_URL runnerRegistrationToken: "REDACTED" rbac: create: true 此处的信息按照 “Set up a specific Runner manually” 下面的提示填写。然后用 Helm 进行安装: $ helm repo add gitlab https://charts.gitlab.io $ kubectl create namespace gitlab-runner $ helm install --namespace gitlab-runner gitlab-runner -f values.yaml gitlab/gitlab-runner 然后去 Kubernetes Dashboard 就可以看到部署的情况,回到 GitLab 也可以看到出现了 “Runners activated for this project” ,表示配置成功。 参考配置:https://docs.gitlab.com/runner/install/kubernetes.html

Read More

用 Kubernetes 部署无状态服务

背景 最近需要部署一个用来跑编译的服务,服务从 MQ 取任务,编译完以后提交任务。最初的做法是包装成 docker,然后用 docker-compose 来 scale up。但既然有 k8s 这么好的工具,就试着学习了一下,踩了很多坑,总结了一些需要用到的命令。 搭建 Docker Registry 首先搭建一个本地的 Docker Repository,首先设置密码: $ mkdir auth $ htpasswd user pass > auth/passwd 然后运行 registry: $ docker run -d -p 5000:5000 \ --restart=always \ --name registry \ -v "$(pwd)/registry":/var/lib/registry \ -v "$(pwd)/auth":/auth \ -e "REGISTRY_AUTH=htpasswd" \ -e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" \ -e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd \ registry:2 简单起见没有配 tls。然后吧本地的 image push 上去:

Read More

用 jailkit 限制用户仅 scp

最近需要用 scp 部署到生产机器,但又不想出现安全问题,所以用了 jailkit 的方法。首先是创建单独的用户,然后生成 ssh key 来认证,不再赘述。此时是可以 scp了,但用户依然可以获得 shell,不够安全。 然后找到了下面参考链接,大概摘录一下所需要的命令和配置: mkdir /path/to/jail chown root:root /path/to/jail chmod 701 /path/to/jail jk_init -j /path/to/jail scp sftp jk_lsh jk_jailuser -m -j /path/to/jail jailed_user vim /path/to/jail/etc/jailkit/jk_lsh.ini # Add following lines [jailed_user] paths = /usr/bin, /usr/lib exectuables = /usr/bin/scp 之后可以发现该用户的 shell 已经更改 jk_chrootsh ,并且只能用 scp 。 参考:https://blog.tinned-software.net/restrict-linux-user-to-scp-to-his-home-directory/

Read More

每周分享第 56 期

咕咕咕 SystemVerilog linter https://github.com/dalance/svlint 东北方言编程语言 https://github.com/zhanyong-wan/dongbei JS LaTeX 渲染到 HTML https://github.com/michael-brade/LaTeX.js 一种对语音助手的攻击 https://surfingattack.github.io/ 在线打铃网站 http://thulpwan.net/timer/ 网络学堂 PC 端 App https://github.com/jiegec/learn_tsinghua_app/releases Rust 2020 roadmap https://github.com/rust-lang/rfcs/pull/2857/files

Read More

通过 BSCAN JTAG 对 Rocket Chip 进行调试

前言 在上一个 post 里研究了原理,今天也是成功在 Artix 7 上实现了调试。效果如下: OpenOCD 输出: Info : JTAG tap: riscv.cpu tap/device found: 0x0362d093 (mfg: 0x049 (Xilinx), part: 0x362d, ver: 0x0) Info : datacount=1 progbufsize=16 Info : Disabling abstract command reads from CSRs. Info : Examined RISC-V core; found 1 harts Info : hart 0: XLEN=32, misa=0x40801105 Info : Listening on port 3333 for gdb connections GDB 输出: Remote debugging using localhost:3333 0x0001018c in getc () at bootloader.

Read More

研究 Rocket Chip 的 BSCAN 调试原理

前言 最近 @jsteward 在研究如何通过 JTAG 对 FPGA 里的 Rocket Chip 进行调试。之前 @sequencer 已经做了一些实践,我们在重复他的工作,同时也研究了一下这是怎么工作的。 原理 我们从 @sequencer 得到了一份可用的 Scala 代码 和 OpenOCD 配置,并且了解到: 可以通过 openocd 找到并调试 Rocket Chip openocd 是通过 JTAG 向 FPGA 的 TAP 的 IR 写入 USER4,然后往 DR 写入特定格式的数据,然后控制 Rocket Chip 的 JTAG。 这里涉及到一个“封装”的过程,在一个仅可以控制 DR 的 JTAG 中控制另一个 JTAG。首先可以找到 OpenOCD 端的操作代码: tunneled_ir[3].num_bits = 3; tunneled_ir[3].out_value = bscan_zero; tunneled_ir[3].in_value = NULL; tunneled_ir[2].num_bits = bscan_tunnel_ir_width; tunneled_ir[2].out_value = ir_dtmcontrol; tunneled_ir[1].in_value = NULL; tunneled_ir[1].

Read More

在 macOS 烧写 Artix7 FPGA

首先安装好openocd: brew install openocd --HEAD 测试所用版本为 0.10.0+dev-01052-g09580964 (2020-02-08-15:09)。 然后编写如下的 openocd.cfg: adapter driver ftdi adapter speed 10000 ftdi_vid_pid 0x0403 0x6014 ftdi_layout_init 0x0008 0x004b source [find cpld/xilinx-xc7.cfg] init xc7_program xc7.tap pld load 0 /path/to/bitstream.bit shutdown 上面的 ftdi 开头的两行按照实际的 JTAG Adapter 修改。可以参考 openocd 自带的一些 cfg。 然后在 openocd.cfg 的目录运行 openocd 即可: $ openocd Open On-Chip Debugger 0.10.0+dev-01052-g09580964 (2020-02-08-15:09) Licensed under GNU GPL v2 For bug reports, read http://openocd.org/doc/doxygen/bugs.html Info : auto-selecting first available session transport "jtag".

Read More