2022年,在 Intel Simics Simulator 公开发行版发布不久后,Simics DML 设备建模语言及其编译器也开始开源。同期,Simics 产品著名布道师 Jakob Engblom 对 DML 语言进行了介绍。详细内容,可参考 Opening up the device modeling language
设备建模语言(DML)是一种面向特定领域的语言,用于快速创建功能性的事务级虚拟平台模型。DML 的首个版本发布于 2005 年,自此以后一直是为 Simics 仿真器构建设备模型的标准方式。
Simics 将 DML 作为主要建模工具的做法,对虚拟平台社区而言是一个颇具启发性的范例。在虚拟平台建模领域,最常见的做法是使用通用编程语言(如 C++ 或 C#),并辅以建模库和仿真器 API。而设计一种专用领域语言(DSL)则在理念上截然不同。根据我们的经验,DML 在提升程序员生产力和模型质量方面带来了显著优势,从而实现了清晰可见的投资回报。
关于 DML 所带来的具体优势,我们有以下几点观察:
- DML 代码比通用语言更简洁、更清晰。
- 得益于更高层次的抽象,代码维护更加容易。
- 更容易遵循良好的事务级建模实践。
- 内置事件驱动执行机制。
- 鼓励在所有接口点使用元数据。
- 虚拟平台特有的操作(例如调度事件回调、输出日志消息)在语言中被实现为内置关键字,而非函数调用。
- 语言定义不受底层语言限制,因此可以添加诸如方法支持多个返回值等实用构造。
- 自动生成支持检查点功能的模型。
- 尽可能采用编译时解析,以最小化运行时开销和通用代码库带来的存储负担。
- 只需对 DML 代码进行简单重新编译,即可支持 Simics 仿真器框架的新版本------因为仿真器 API 由编译器处理。
- DML 代码可在不同主机类型之间移植,因为语言本身和 Simics 仿真器运行时系统将模型代码与主机的具体细节隔离开来。
过去,由于 DML 仅作为 Simics 仿真器的一部分提供,其用户群体和受众范围相当有限。如今这一情况已发生改变:Simics 仿真器已发布公开版本,而 DML 语言及其编译器也已在 GitHub 上以开源形式发布。这两项举措共同使得任何对此感兴趣的人都能轻松尝试 DML,并在虚拟平台环境中进行设备建模。
DML 的背景
在 DML 出现之前,Simics 仿真器的设备建模工作是通过 C 或 C++ 语言结合 Simics API 完成的。这种方式导致了大量样板代码,用于完成诸如向仿真器核心注册类等强制性任务。每当程序员遇到这种不必要的重复时,很自然地会想到设计一种小型语言,以提炼出问题中真正有趣的部分。DML 正是从一个最初的 C 代码生成器逐步演化而来,最终发展成为一门完整的语言。
由此诞生了 2005 年发布的 DML 1.0 版本。2007 年又发布了第二版 DML 1.2,该版本运行良好,但随着时间推移,对其进行重大重构的需求日益明显。当前版本 DML 1.4 于 2019 年首次发布,相较于 DML 1.2,它在语法上进行了大幅调整,并对语言语义进行了精炼和明确定义。此后,DML 持续不断加入新特性,更多功能仍在开发中。
DML 编译器会生成包含仿真器 API 调用的 C 代码。使用 DML 编写的模型可与使用纯 C、C++、Python 和 SystemC 编写的模型在同一 Simics 仿真器会话中共存。
设备建模
设备建模语言(DML)用于对设备(即独立的硬件模块)进行建模,例如定时器、串行端口、中断控制器、加速器模块或以太网接口等。DML 假设运行环境是一个事件驱动的事务级仿真器,其中设备模型由外部的一系列函数调用所驱动,并通过调用其他设备模型来执行操作。设备模型通常是系统层次结构中的叶节点(与指令集仿真器、内存映射、互连结构和存储器并列),并通过一个独立的仿真器配置系统创建。
DML 为每个备模型的主要接口都提供了专门的语言构造:
- 编程寄存器(寄存器组):供软件驱动程序使用。
- Connects:允许设备调用其他设备。
- Ports:接收来自其他设备的调用。
- Events:用于在未来某个时间点触发回调。
- Attributes:用于配置设备,并为工具和用户提供对设备状态的后门访问途径。