mlvp 已更名为 Toffee
Toffee 是一款基于 Python 的硬件验证框架,旨在帮助用户更加便捷、规范地使用 Python 构建硬件验证环境。它依托于多语言转换工具 picker,该工具能够将硬件设计的 Verilog 代码转换为 Python Package,使得用户可以使用 Python 来驱动并验证硬件设计。
Toffee 吸收了部分 UVM 验证方法学,确保验证环境的规范性与可复用性。此外,toffee 对验证环境的构建方式进行了重新设计,使其更符合软件开发者的使用习惯,从而让软件开发者能够轻松上手硬件验证工作。
更多关于 Toffee 的介绍,请参阅 Toffee 文档。
Toffee 需要的依赖有:
- Python 3.6.8+
- Picker 0.9.0+
当安装好上述依赖后,可通过 pip 安装 toffee:
pip install pytoffee
或通过以下命令安装最新版本的 toffee:
pip install pytoffee@git+https://github.com/XS-MLVP/toffee@master
通过以下方式可进行本地安装:
git clone https://github.com/XS-MLVP/toffee.git
cd toffee
pip install .
我们使用一个简单的加法器示例来演示 Toffee 的使用方法,该示例位于 example/adder
目录下。
加法器的设计如下:
module Adder #(
parameter WIDTH = 64
) (
input [WIDTH-1:0] io_a,
input [WIDTH-1:0] io_b,
input io_cin,
output [WIDTH-1:0] io_sum,
output io_cout
);
assign {io_cout, io_sum} = io_a + io_b + io_cin;
endmodule
使用 Toffee 搭建验证环境之前,需要使用 picker 将设计转换为 Python Package。安装好依赖后,可以直接在 example/adder
目录下运行以下命令来完成转换:
make dut
为了验证加法器的功能,需要使用 Toffee 提供的方法来建立验证环境。
首先需要为其创建加法器接口的驱动方法,这里用到了 Bundle
来描述需要驱动的某类接口,Agent
用于编写对该接口的驱动方法。如下所示:
class AdderBundle(Bundle):
a, b, cin, sum, cout = Signals(5)
class AdderAgent(Agent):
@driver_method()
async def exec_add(self, a, b, cin):
self.bundle.a.value = a
self.bundle.b.value = b
self.bundle.cin.value = cin
await self.bundle.step()
return self.bundle.sum.value, self.bundle.cout.value
为了验证加法器的功能,我们定义一个 Model
类用于捕获与DUT的交互信息并进行比对。
class AdderModel(Model):
@driver_hook(agent_name="add_agent")
def exec_add(self, a, b, cin):
result = a + b + cin
sum = result & ((1 << 64) - 1)
cout = result >> 64
return sum, cout
接下来,需要创建一个顶层的测试环境,并与Model相关联,如下所示:
class AdderEnv(Env):
def __init__(self, adder_bundle):
super().__init__()
self.add_agent = AdderAgent(adder_bundle)
self.attach(AdderModel())
此时,验证环境已经搭建完成,Model 中的方法会被自动调用,并将结果与加法器的输出进行比对。
之后,需要编写测试用例来验证加法器的功能,通过 toffee-test,可以使用如下方式编写测试用例。
@toffee_test.testcase
async def test_random(adder_env):
for _ in range(1000):
a = random.randint(0, 2**64 - 1)
b = random.randint(0, 2**64 - 1)
cin = random.randint(0, 1)
await adder_env.add_agent.exec_add(a, b, cin)
@toffee_test.testcase
async def test_boundary(adder_env):
for cin in [0, 1]:
for a in [0, 2**64 - 1]:
for b in [0, 2**64 - 1]:
await adder_env.add_agent.exec_add(a, b, cin)
可以直接在 example/adder
目录下运行以下命令来运行该示例:
make run
运行结束后报告将自动在reports
目录下生成。
更加详细的使用方法,请参考 Toffee 文档。
本项目隶属 万众一芯(UnityChip) 开放验证,更多信息请访问 open-verify.cc