准备好双控开关的Verilog程序:
module on_off_switch(
input a,
input b,
output f
);
assign f = a ^ b;
endmodule
准备约束文件:
在将双控开关接入nvboard的过程中,参照以下GitHub项目的说明文档进行操作:
GitHub - NJU-ProjectN/nvboard: NJU Virtual Board
绑定引脚过程中遇到如下报错:
$ python3 $(NVBOARD_HOME)/scripts/auto_pin_bind.py $(NVBOARD_HOME)/example/switch/constr/top.nxdc $(NVBOARD_HOME)/example/switch/build/auto_bind.cpp
NVBOARD_HOME:未找到命令
NVBOARD_HOME:未找到命令
NVBOARD_HOME:未找到命令
python3: can't open file '/scripts/auto_pin_bind.py': [Errno 2] No such file or directory
经过查询,使用python3时,替换$(NVBOARD_HOME)不能使用 “)” ,而要使用 " } " 。
因此修改为:
$ python3 ${NVBOARD_HOME}/scripts/auto_pin_bind.py ${NVBOARD_HOME}/example/switch/constr/top.nxdc ${NVBOARD_HOME}/example/switch/build/auto_bind.cpp
可以正常运行。且正常保存文件。
Makefile文件可以正常使用源码中的
TOPNAME = top
NXDC_FILES = constr/top.nxdc #约束文件路径
INC_PATH ?= #?=的意义是,INC_PATH如果被未被定义,则为?=后的值,如果被定义过,则保持原来的值
VERILATOR = verilator
VERILATOR_CFLAGS += -MMD --build -cc \
-O3 --x-assign fast --x-initial fast --noassert
BUILD_DIR = ./build
OBJ_DIR = $(BUILD_DIR)/obj_dir #OBJ_DIR = ./build/obj_dir
BIN = $(BUILD_DIR)/$(TOPNAME) #BIN = ./build/top
default: $(BIN) #终极目标为default,依赖./build/top
$(shell mkdir -p $(BUILD_DIR))
# constraint file
SRC_AUTO_BIND = $(abspath $(BUILD_DIR)/auto_bind.cpp)
$(SRC_AUTO_BIND): $(NXDC_FILES)
python3 $(NVBOARD_HOME)/scripts/auto_pin_bind.py $^ $@
# project source
VSRCS = $(shell find $(abspath ./vsrc) -name "*.v")
# 在vsrc目录中寻找所有的.v文件,并保存在变量VSRCS中
CSRCS = $(shell find $(abspath ./csrc) -name "*.c" -or -name "*.cc" -or -name "*.cpp")
# 在csrc目录中寻找所有的.c/.cc/.cpp文件,并保存在变量CSRCS中
CSRCS += $(SRC_AUTO_BIND)
# 将auto_bind.cpp文件,追加在变量CSRCS中
# rules for NVBoard
include $(NVBOARD_HOME)/scripts/nvboard.mk
# 包含NVBoard相关Makelile规则
# rules for verilator
INCFLAGS = $(addprefix -I, $(INC_PATH))
CXXFLAGS += $(INCFLAGS) -DTOP_NAME="\"V$(TOPNAME)\""
$(BIN): $(VSRCS) $(CSRCS) $(NVBOARD_ARCHIVE)
@rm -rf $(OBJ_DIR) # 生成新的对象之前,删除旧的对象文件
$(VERILATOR) $(VERILATOR_CFLAGS) \
--top-module $(TOPNAME) $^ \
$(addprefix -CFLAGS , $(CXXFLAGS)) $(addprefix -LDFLAGS , $(LDFLAGS)) \
--Mdir $(OBJ_DIR) --exe -o $(abspath $(BIN))
all: default
run: $(BIN)
@$^
clean:
rm -rf $(BUILD_DIR)
.PHONY: default all clean run
最后一个是sim.cpp
#include <nvboard.h>
#include <Von_off_switch.h>
static TOP_NAME dut;
void nvboard_bind_all_pins(TOP_NAME* top);
int main() {
nvboard_bind_all_pins(&dut);
nvboard_init();
while(1) {
nvboard_update();
dut.eval();
}
}
犯的错:
一开始没有在while循环中添加 dut.eval(); 导致虽然能够出现界面,但是功能无法实现。也就是拨动开关LED不会亮。
dut.eval();时用来实时更新电路状态的调用。
这样就实现了双控开关的接入