nju-projectn / nvboard Goto Github PK
View Code? Open in Web Editor NEWNJU Virtual Board
License: Other
NJU Virtual Board
License: Other
在开发 NVDL 时,hwr 想到,如果链接了 nvboard 的二进制文件能够输出按键等信息到日志,那么可以自动生成简单的 testbench (延时问题可以另外写程序解决)。
以项目中的example为例,example 将nvboard.a 作为库被 verilator 识别并链接,以此提供 nvboard 的相关功能.但是这样引入了一个问题: nvboard.a只是被 verilator 认为是外部的库而不会加入依赖项中,也就是说仅仅是 nvboard.a 的改变不会引起 main.cpp 的重新编译.
example中似乎使用删除veriator生成的相关代码并重新编译来避免这个问题
# example/Makefile:34-39
$(BIN): $(VSRCS) $(CSRCS) $(NVBOARD_ARCHIVE)
+++ @rm -rf $(OBJ_DIR) <--- 这里删除了obj_dir
$(VERILATOR) $(VERILATOR_CFLAGS) \
--top-module $(TOPNAME) $^ \
$(addprefix -CFLAGS , $(CXXFLAGS)) $(addprefix -LDFLAGS , $(LDFLAGS)) \
--Mdir $(OBJ_DIR) --exe -o $(abspath $(BIN))
对于example这样较小的项目这样做是没有问题的,但是如果Verilog部分的代码比较庞大(如ysyxSoC),删除重新编译的方法的耗时是相当巨大的,此时必须依赖ccache来提升编译性能,同时意外发现,有时候ccahce并没有起到作用,导致编译非常的折磨人.
因此我希望在此探讨提升依赖nvboard项目编译性能可能的办法:
diff --git a/.gitignore b/.gitignore
index 0c7970f..5511ce6 100644
--- a/.gitignore
+++ b/.gitignore
@@ -11,3 +11,4 @@
!*.v
!*.cpp
build/
+/usr/
\ No newline at end of file
diff --git a/include/pins.h b/include/pins.h
index 6075a29..d48d045 100644
--- a/include/pins.h
+++ b/include/pins.h
@@ -1,7 +1,7 @@
#ifndef __PINS_H__
#define __PINS_H__
-#include <../usr/include/pins.h>
+#include <usr/pins.h>
#include <stdint.h>
#include <assert.h>
diff --git a/usr/include/nvboard.h b/include/usr/nvboard.h
similarity index 100%
rename from usr/include/nvboard.h
rename to include/usr/nvboard.h
diff --git a/usr/include/pins.h b/include/usr/pins.h
similarity index 100%
rename from usr/include/pins.h
rename to include/usr/pins.h
diff --git a/scripts/nvboard.mk b/scripts/nvboard.mk
index 5144118..7f75e51 100644
--- a/scripts/nvboard.mk
+++ b/scripts/nvboard.mk
@@ -21,6 +21,8 @@ $(NVBOARD_BUILD_DIR)/%.o: $(NVBOARD_SRC)/%.cpp
$(NVBOARD_ARCHIVE): $(NVBOARD_OBJS)
@echo + AR "->" $(shell realpath $@ --relative-to $(NVBOARD_HOME))
@ar rcs $(NVBOARD_ARCHIVE) $(NVBOARD_OBJS)
+ @mkdir -p $(NVBOARD_USR_INC)
+ @cp --no-preserve=timestamps $(NVBOARD_INC)/usr/* $(NVBOARD_USR_INC)
# Rule (`#include` dependencies): paste in `.d` files generated by gcc on `-MMD`
-include $(NVBOARD_OBJS:.o=.d)
最开始的想法为在 $(NVBOARD_ARCHIVE)
的编译过程中添加 touch $(NVBOARD_USR_INC)/*
, 通过 $(NVBOARD_USR_INC)/{nvboard,pins}.h
的改变来告知make需要重新编译那些引用了nvboard.a的文件.
但是我发现pins.h同时被外部的程序与nvboard自生引用.因此 touch
的方案会导致对nvboard的大量的不必要的编译.因此有了这样的修改.将NVBOARD_USR_INC
移动到 include/usr
, nvboard自身使用include/usr
中的内容而nvboard对外则依然使用 NVBOARD_USR_INC
, 同时使用 cp --no-preserve=timestamps
来保证 NVBOARD_USR_INC
内容的更新.
我的makefile, 无rm obj_dir
$(BIN):$(TOP_MK) $(CSRC) $(HSRC) $(NVBOARD_ARCHIVE)
@echo + MAKE "->" npc[$(notdir $(BIN))]
make -C $(OBJ_DIR) -f $<
$(TOP_MK):$(VSRCS)
@$(VERILATOR) --top-module $(TOP) $(SRCS) $(NVBOARD_ARCHIVE) \
--cc --exe\
-CFLAGS -I$(abspath ./include)\
$(addprefix -CFLAGS , $(CFLAGS))\
$(addprefix -LDFLAGS , $(LDFLAGS)) \
$(addprefix -I, $(VSRC_INCLUDE_PATH))\
--no-timing --timescale "1ns/1ns" --clk clock\
--threads 1 --threads-dpi pure\
-j\
--trace-fst\
$(addprefix +define+,$(DEFINE))\
--Mdir $(OBJ_DIR) -o $(BIN)
参照example中的方式进行编译的代码, 有rm obj_dir
$(BIN):$(SRCS) $(NVBOARD_ARCHIVE)
@rm -rf $(OBJ_DIR)
@$(VERILATOR) --top-module $(TOP) $(SRCS) $(NVBOARD_ARCHIVE) \
--cc --exe --build\
-CFLAGS -I$(abspath ./include)\
$(addprefix -CFLAGS , $(CFLAGS))\
$(addprefix -LDFLAGS , $(LDFLAGS)) \
$(addprefix -I, $(VSRC_INCLUDE_PATH))\
--no-timing --timescale "1ns/1ns" --clk clock\
--threads 1 --threads-dpi pure\
-j\
--trace-fst\
$(addprefix +define+,$(DEFINE))\
--Mdir $(OBJ_DIR) -o $(BIN)
测试指令: time make -j OBJCACHE=""
我这里强行不使用ccache来展示性能差异
测试流程为: make clean -> time make -> touch nvboard/src -> time make
Executed in | usr time | sys time | |
---|---|---|---|
第一次 | 11.18 secs | 26.10 secs | 1.23 secs |
第二次 | 1.18 secs | 1.39 secs | 0.23 secs |
Executed in | usr time | sys time | |
---|---|---|---|
第一次 | 11.10 secs | 25.63 secs | 1.43 secs |
第二次 | 12.43 secs | 29.72 secs | 1.76 secs |
可见性能提升相当明显.同时我makefile的写法要求nvboard.a nvboard.h pins.h同时发生改变,因此我认为对nvboard的相关修改是有一定可行性的.
在虚拟机的Ubuntu20.04系统下运行nvboard,界面出来很卡,请问有没有解决办法???
I was compiling code using ANx ports, but I get errors for there no enum like AN0. After that, I try to use rg to find if there is any SC about these ports, but found nothing about the definition of ANx ports.
My question is are they useless or replaced by other ports?
# flake.nix
{
description = "A flake to provide an environment for NVBoard";
inputs = {
nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
flake-utils.url = "github:numtide/flake-utils";
};
outputs = { self, nixpkgs, flake-utils }:
flake-utils.lib.eachDefaultSystem (system:
let
pkgs = import nixpkgs { inherit system; };
in {
devShell = pkgs.mkShell {
buildInputs = with pkgs; [ SDL2 SDL2_image SDL2_ttf verilator ];
# 注意设置这个 NVBOARD_HOME
shellHook = ''
export NVBOARD_HOME=`pwd`
export SHELL=$(which zsh)
exec $SHELL
'';
};
}
);
}
然后可以通过命令nix develop
来展开这个flake.nix对应的环境
我在查看N4文件的时候,发现nvboard并没有系统级的clk,只有vga和ps2的clk。但是我在看example代码的时候,发现引脚绑定并不需要绑定top的clk。想问问是否有默认top中的clk不需要绑定的设计,这个clk与vga和ps2的clk有什么样的区别和联系?
#include <nvboard.h>
#include "../build/obj_dir/Vtop.h"
static Vtop dut;
void nvboard_bind_all_pins(Vtop* top);
以下代码会标红警告:
#include <Vtop.h>
static TOP_NAME dut;
void nvboard_bind_all_pins(TOP_NAME* top);
我认为这种写法不规范,而且容易造成歧义,比如如果在 example 中进行 make all 编译,Vtop.h 的路径并不对,而且TOP_NAME是一个不存在的类型。
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.