uvm32一款极简、无依赖的虚拟机沙盒,支持动态加载APP,仅需3KB Flash/1KB RAM

https://github.com/ringtailsoftware/uvm32

uvm32是一款极简、无依赖的虚拟机沙箱,专为微控制器及其他资源受限设备设计。采用单文件C语言实现,无动态内存分配,采用异步架构,完全兼容C99标准。在STM32L0(ARM Cortex-M0+)平台上,其存储占用低于3KB闪存/1KB RAM。

uvm32本质上是封装了管理接口的RISC-V模拟器,并提供配套工具链以构建可在其中运行的高效代码。

应用场景
1、作为嵌入式脚本引擎(Lua、Duktape、MicroPython等)的轻量替代方案
2、作为隔离系统中不可信或不稳定组件的安全沙箱
3、在目标平台缺乏编译器的场景下,支持使用现代系统编程语言开发(如Rust示例)
4、实现"一次编写,随处运行",避免维护多版本软件

核心特性
1、提供C、Zig、Rust及汇编语言的字节码示例程序
2、非阻塞设计,防止异常字节码阻塞主机系统
3、不预设主机IO能力(无标准IO依赖)
4、简洁而明确执行模型
5、安全的最小化类型FFI接口
6、既可满足简单脚本/插件需求,亦能支持复杂场景

安全性优先于速度,确保虚拟机内的异常代码永远不会导致主机崩溃,虽基于完整CPU模拟器实现,但专注于执行自定义脚本逻辑,而非硬件模拟

与同类方案的比较
现有许多适用于小型系统的脚本语言与虚拟机都在不同维度做出了权衡取舍。

uvm32致力于:
1、极小资源占用(适配嵌入式设备、游戏及应用)
2、支持使用成熟编程语言开发虚拟机代码(配备高质量开发工具)
3、易于集成至现有软件体系
4、支持多种编程范式(事件驱动、轮询、多处理器)

对异常虚拟机代码具备强容错性

uvm32不追求:
1、零摩擦FFI(主机与虚拟机代码间无直接函数调用)
2、极限运行效率
3、最简单的脚本开发体验(需要完整的开发-编译-运行周期)

"开箱即用"的标准IO、网络等功能库

项目结构说明
uvm32是微型虚拟机的核心实现,所有代码均位于uvm32目录中。
host-mini展示了运行虚拟机代码的最简主机示例。
其余目录均为进阶主机示例,或可供主机运行的示例应用程序。

UVM 中定义一个 32 位无符号整数,通常使用 `bit [31:0]` 或 `logic [31:0]` 类型。这两种类型都表示 32 位宽的数据结构,适用于寄存器模型、事务类(transaction class)以及序列项(sequence item)等场景。例如,在 UVM 的事务类中,可以使用 `rand bit [31:0]` 来声明一个随机化的 32 位无符号整数字段,如以下代码所示: ```systemverilog class dadd_item extends uvm_sequence_item; `uvm_object_utils_begin(dadd_item) `uvm_field_int(data, UVM_ALL_ON) `uvm_field_int(addr, UVM_ALL_ON) `uvm_object_utils_end rand bit data_en; rand bit [31:0] data; rand bit [31:0] addr; extern function new(string name = "dadd_item"); endclass: dadd_item ``` 上述代码定义了一个名为 `dadd_item` 的事务类,其中 `data` 和 `addr` 被声明为 `rand bit [31:0]` 类型,表示它们是 32 位宽的随机无符号整数字段。这些字段可以通过 UVM 的 `uvm_field_int` 宏进行自动化处理,包括随机化、打印、比较等操作,这在测试和验证过程中非常有用[^4]。 此外,UVM 中的寄存器模型也广泛使用 32 位数据类型,例如在定义寄存器地址和数据宽度时,通常会使用宏 `UVM_REG_DATA_WIDTH` 和 `UVM_REG_ADDR_WIDTH`,它们的默认值分别为 64 位。如果要将寄存器数据宽度设置为 32 位,可以在编译时通过参数定义来覆盖默认值。这种机制确保了寄存器模型的灵活性和可配置性[^1]。 ### 数据类型选择 在 UVM 中,`bit [31:0]` 和 `logic [31:0]` 都可以用于表示 32 位无符号整数,但它们的语义和用途略有不同。`bit` 类型支持 0 和 1 两种状态,适用于不要未知(X)或高阻态(Z)的场景,而 `logic` 类型支持四种状态(0、1、X、Z),适用于更复杂的硬件行为建模。因此,在事务类中通常使用 `bit [31:0]`,而在要处理未知状态的寄存器模型中则更倾向于使用 `logic [31:0]`。 ### 自动化机制支持 UVM 提供了强大的字段自动化机制,通过 `uvm_field_int` 宏可以轻松地对 `bit [31:0]` 或 `logic [31:0]` 类型的字段进行操作。例如,`uvm_field_int(data, UVM_ALL_ON)` 会自动处理字段的随机化、打印、比较、打包和解包等操作,这大大化了事务类的实现,并提高了代码的可维护性[^4]。 ### 示例:使用 `bit [31:0]` 的事务类 以下是一个完整的事务类示例,展示了如何在 UVM 中定义和使用 32 位无符号整数: ```systemverilog class my_transaction extends uvm_sequence_item; `uvm_object_utils(my_transaction) rand bit [31:0] payload; rand bit [31:0] address; function new(string name = "my_transaction"); super.new(name); endfunction `uvm_field_int(payload, UVM_ALL_ON) `uvm_field_int(address, UVM_ALL_ON) endclass ``` 在该示例中,`payload` 和 `address` 被定义为 `rand bit [31:0]` 类型,并通过 `uvm_field_int` 宏进行自动化处理。这种实现方式不化了字段操作,还提高了代码的可读性和可重用性。 ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值