nvboard: remove is_rt and is_output in nvboard_bind_pin() API

* after refactoring the internal implementation, they are unused now
This commit is contained in:
Zihao Yu 2024-01-02 03:49:01 +08:00
parent adb4b76976
commit 166f29349d
5 changed files with 40 additions and 67 deletions

View File

@ -16,10 +16,10 @@ NVBoard(NJU Virtual Board)是基于SDL开发的虚拟FPGA开发板可以在Ve
│   ├── at_scancode.h
│   ├── component.h
│   ├── configs.h
│   ├── constrs.h
│   ├── keyboard.h
│   ├── macro.h
│   ├── nvboard.h
│   ├── pins.h
│   ├── render.h
│   └── vga.h
├── pic # NVBoard图片资源
@ -27,9 +27,10 @@ NVBoard(NJU Virtual Board)是基于SDL开发的虚拟FPGA开发板可以在Ve
├── scripts
│   ├── auto_pin_bind.py # 生成引脚绑定代码的脚本
│   └── nvboard.mk # NVBoard构建规则
── src # NVBoard源码
── src # NVBoard源码
│ ├── component.cpp
│ ├── event.cpp
│ ├── keyboard.cpp
│ ├── nvboard.cpp
│ ├── render.cpp
│ └── vga.cpp
@ -55,10 +56,7 @@ NVBoard提供了以下几组API
- `void nvboard_init()`: 初始化NVBoard
- `void nvboard_quit()`: 退出NVBoard
- `void nvboard_bind_pin(void *signal, bool is_rt, bool is_output, int len, ...)`: 将HDL的信号signal连接到NVBoard里的引脚上具体地
- `is_rt`为`true`时表示该信号为实时信号每个周期都要更新才能正确工作如键盘和VGA相关信号
`is_rt`为`false`时表示该信号为普通信号可以在NVBoard更新画面时才更新从而提升NVBoard的性能如拨码开关和LED灯等无需每个周期都更新
- `is_output`为`true`时,表示该信号方向为输出方向(从RTL代码到NVBoard);否则为输入方向(从NVBoard到RTL代码)
- `void nvboard_bind_pin(void *signal, int len, ...)`: 将HDL的信号signal连接到NVBoard里的引脚上具体地
- `len`为信号的长度大于1时为向量信号
- 可变参数列表`...`为引脚编号列表编号为整数绑定向量信号时引脚编号列表从MSB到LSB排列
- `void nvboard_update()`: 更新NVBoard中各组件的状态每当电路状态发生改变时都需要调用该函数
@ -88,6 +86,7 @@ signal (pin1, pin2, ..., pink)
~~如果发现脚本中的错误也可以尝试修复一下然后丢pr~~
可以在`board`目录下的引脚说明文件中查看引脚信息。
其中`output`表示该信号方向为输出方向(从RTL代码到NVBoard)`input`为输入方向(从NVBoard到RTL代码)。
其中,复位引脚`RST`不使用因为NVBoard在cpp文件中包含一些内部状态仅复位RTL设计部分会使其与NVBoard状态不一致。
一个实现全系统复位效果的简单方法是退出NVBoard并重新运行。RTL设计的复位工作由verilator的wrapper完成具体见`example/csrc/main.cpp`。

View File

@ -117,33 +117,33 @@ output SEG7F
output SEG7G
output DEC7P
rt_output VGA_VSYNC
rt_output VGA_HSYNC
rt_output VGA_BLANK_N
rt_output VGA_R0
rt_output VGA_R1
rt_output VGA_R2
rt_output VGA_R3
rt_output VGA_R4
rt_output VGA_R5
rt_output VGA_R6
rt_output VGA_R7
rt_output VGA_G0
rt_output VGA_G1
rt_output VGA_G2
rt_output VGA_G3
rt_output VGA_G4
rt_output VGA_G5
rt_output VGA_G6
rt_output VGA_G7
rt_output VGA_B0
rt_output VGA_B1
rt_output VGA_B2
rt_output VGA_B3
rt_output VGA_B4
rt_output VGA_B5
rt_output VGA_B6
rt_output VGA_B7
output VGA_VSYNC
output VGA_HSYNC
output VGA_BLANK_N
output VGA_R0
output VGA_R1
output VGA_R2
output VGA_R3
output VGA_R4
output VGA_R5
output VGA_R6
output VGA_R7
output VGA_G0
output VGA_G1
output VGA_G2
output VGA_G3
output VGA_G4
output VGA_G5
output VGA_G6
output VGA_G7
output VGA_B0
output VGA_B1
output VGA_B2
output VGA_B3
output VGA_B4
output VGA_B5
output VGA_B6
output VGA_B7
rt_input PS2_CLK
rt_input PS2_DAT
input PS2_CLK
input PS2_DAT

View File

@ -8,14 +8,9 @@
#include <vga.h>
#include <keyboard.h>
#define BIND_RATE_RT true
#define BIND_RATE_SCR false
#define BIND_DIR_OUT true
#define BIND_DIR_IN false
void nvboard_init(int vga_clk_cycle = 1);
void nvboard_quit();
void nvboard_bind_pin(void *signal, bool is_rt, bool is_output, int len, ...);
void nvboard_bind_pin(void *signal, int len, ...);
void nvboard_update();
#endif

View File

@ -9,21 +9,12 @@ class BoardDescParser():
def parseLine(self, lid, lineseg):
direction = lineseg[0].strip()
pinname = lineseg[1].strip()
if direction.startswith('rt_'):
is_realtime = True
direction = direction[3:]
else:
is_realtime = False
if direction == "input":
is_output = False
elif direction == "output":
is_output = True
else:
if direction != "input" and direction != "output":
print(f"Board Line {lid}: Error: Invalid pin direction \"{direction}\"")
exit(-1)
self.pins[pinname] = (is_realtime, is_output)
self.pins[pinname] = 1
def parseFile(self, path):
self.pins = {}
@ -47,12 +38,6 @@ class BoardDescParser():
def checkPinValid(self, pin):
return pin in self.pins
def getPinRateStr(self, pin):
return "BIND_RATE_RT " if self.pins[pin][0] else "BIND_RATE_SCR"
def getPinDirStr(self, pin):
return "BIND_DIR_OUT" if self.pins[pin][1] else "BIND_DIR_IN "
class NxdcParser():
@ -182,20 +167,14 @@ class AutoBindWriter():
if not self.board.checkPinValid(pin):
print(f"Error: Invalid pin {pin}")
exit(1)
ratestr = self.board.getPinRateStr(pin)
dirstr = self.board.getPinDirStr(pin)
self.iw.write(f"nvboard_bind_pin( &top->{signal}, {ratestr}, {dirstr}, 1, {pin});\n")
self.iw.write(f"nvboard_bind_pin( &top->{signal}, 1, {pin});\n")
def bindVec(self, signal, pins):
for pin in pins:
if not self.board.checkPinValid(pin):
print(f"Error: Invalid pin {pin}")
exit(1)
ratestr = self.board.getPinRateStr(pins[0])
dirstr = self.board.getPinDirStr(pins[0])
self.iw.write(f"nvboard_bind_pin( &top->{signal}, {ratestr}, {dirstr}, {len(pins)}")
self.iw.write(f"nvboard_bind_pin( &top->{signal}, {len(pins)}")
for pin in pins:
self.iw.write(f", {pin}")
self.iw.write(");\n")

View File

@ -108,7 +108,7 @@ void nvboard_quit(){
SDL_Quit();
}
void nvboard_bind_pin(void *signal, bool is_rt, bool is_output, int len, ...) {
void nvboard_bind_pin(void *signal, int len, ...) {
assert(len < 64);
va_list ap;
va_start(ap, len);