一种方法是创建一个专用测试模块,比如test-checksum,其中包含一个测试设备,比如test_checksum_dev,它只导入你的公共代码,并将calculate_checksum方法暴露给 Python,这样很容易编写测试。这分两步完成:首先,将方法公开给 C:
dml 1.4;
device test_checksum_dev;
import "checksum-common.dml";
// Make DML method calculate_checksum available as extern C symbol "calculate_checksum"
// The signature will be:
// uint64 calculate_checksum(conf_object_t *obj, bytes_t data)
export calculate_checksum as "calculate_checksum";
第二步是将其暴露给 Python。创建checksum.h:
#ifndef CHECKSUM_H
#define CHECKSUM_H
#include <simics/base/types.h>
#include <simics/pywrap.h>
extern uint32 calculate_checksum(conf_object_t *obj, bytes_t data);
#endif /* CHECKSUM_H */
(如果您还将 header %{ #include "checksum.h" %} 添加到 DML 文件,您将得到一个硬检查以确保签名保持一致)。
现在将头文件添加到模块 makefile 中的 IFACE_FILES 以创建 Python 包装:
SRC_FILES = test-checksum.dml
IFACE_FILES = checksum.h
include $(MODULE_MAKEFILE)
您现在可以直接从测试中调用 DML 方法:
SIM_load_module('test-checksum')
from simmod.test_checksum.checksum import calculate_checksum
obj = SIM_create_object('test_checksum_dev', 'dev', checksum_ini=0xdeadbeef)
assert calculate_checksum(obj, b'hello world') == (0xda39ba47).to_bytes(4, 'little')