kratos是一种嵌入python的快速硬件设计语言。
kratos的Python项目详细描述
克雷多斯是用C++/Python编写的硬件设计语言。它 通过以下设计将自己与其他DSL区分开来 理念:
- 完全可调试:用户可以看到每个进程的跟踪 每个verilog语句。
- 高效:python前端由 现代C++绑定。设计时考虑到多个处理。
- 人类可读的verilog:我们知道读机器有多困难 生成verilog。奎托斯有很多传球让你看起来很漂亮 verilog公司。
- 生成器生成器:每个python对象都是生成器 即使在实例化之后,也可以随时修改。这允许 复杂的东西在发电机上传递,而没有拆开旧的结构。
- 保留verilog的好部分:行为中的always块 verilog与其他编程语言很接近。奎托斯允许你 编写类似于行为verilog的python代码
- 唯一的真相来源:奎托斯鼓励用户注入发生器 发电机内部的信息。这使得调试和 验证要容易得多。
- 静态精化:kratos允许用户编写参数化代码, 甚至在always块中,都是python中的。
- 类型检查:kratos检查变量类型 以确保没有隐式转换。
安装
pip install kratos
预构建的wheels在linux上支持所有python 3.5+,在osx上支持python3.7。 要从头开始构建它,您需要一个C++17兼容的编译器,例如 作为g++-8。
文档和示例
您可以在Read the Docs
这里有一些例子来展示奎托斯的能力。
ASNYC复位寄存器
基于width进行参数化的python代码。注意我们 定义时指定always块的灵敏度 seq_code_block。
classAsyncReg(Generator):def__init__(self,width):super().__init__("register")# define inputs and outputsself._in=self.input("in",width)self._out=self.output("out",width)self._clk=self.clock("clk")self._rst=self.reset("rst")self._val=self.var("val",width)# add combination and sequential blocksself.add_code(self.seq_code_block)self.add_code(self.comb_code_block)@always((Posedge,"clk"),(Posedge,"rst"))defseq_code_block(self):ifself._rst:self._val=0else:self._val=self._indefcomb_code_block(self):self._out=self._val
这是生成的verilog
moduleregister(inputclk,input[15:0]in,outputreg[15:0]out,inputrst);logic[15:0]val;always@(posedgeclk,posedgerst)beginifrstbeginval<=16'h0;endelsebeginval<=in;endendalways_combbeginout=val;endendmodule// register
扇出模块
这是一个展示克瑞托斯静态精化能力的例子。 always块。实际上我们不会这样写。
classPassThrough(Generator):def__init__(self,num_loop):super().__init__("PassThrough",True)self.in_=self.input("in",1)self.out_=self.output("out",num_loop)self.num_loop=num_loopself.add_code(self.code)defcode(self):ifself.in_==self.const(1,1):foriinrange(self.num_loop):self.out_[i]=1else:foriinrange(self.num_loop):self.out_[i]=0
下面是生成的verilog
modulePassThrough(inputin,outputreg[3:0]out);always_combbeginif(in==1'h1)beginout[0:0]=1'h1;out[1:1]=1'h1;out[2:2]=1'h1;out[3:3]=1'h1;endelsebeginout[0:0]=1'h0;out[1:1]=1'h0;out[2:2]=1'h0;out[3:3]=1'h0;endendendmodule// PassThrough
如何调试
因为python非常慢,默认情况下调试选项是关闭的。你 可以为单个模块打开调试。下面是一个关于如何 打开调试(有关详细信息,请参见tests/test_generator.py)。
classPassThroughMod(Generator):def__init__(self):super().__init__("mod1",True)self.in_=self.input("in",1)self.out_=self.output("out",1)self.wire(self.out_,self.in_)# ... some other codeclassTop(Generator):def__init__(self):super().__init__("top",True)self.input("in",1)self.output("out",1)pass_through=PassThroughMod()self.add_child("pass",pass_through)self.wire(self["pass"].ports["in"],self.ports["in"])self.wire(self.ports.out,self["pass"].ports.out)mod=Top()mod_src,debug_info=verilog(mod,debug=True)
您可以看到生成的verilog:
moduletop(inputlogicin,outputlogicout);assignout=in;endmodule// top
由于编译器优化,pass子模块消失。 但是,如果我们打印出调试信息,我们可以看到完整的 调试信息的跟踪assign out = in;
{1:[('/home/keyi/workspace/kratos/tests/test_generator.py',532)],2:[('/home/keyi/workspace/kratos/tests/test_generator.py',534)],3:[('/home/keyi/workspace/kratos/tests/test_generator.py',535)],6:[('/home/keyi/workspace/kratos/tests/test_generator.py',539),('/home/keyi/workspace/kratos/src/expr.cc',455),('/home/keyi/workspace/kratos/tests/test_generator.py',541),('/home/keyi/workspace/kratos/src/expr.cc',485),('/home/keyi/workspace/kratos/src/pass.cc',653)]}
这些pass.cc是删除传递模块的传递。
如果我们稍微修改一下源代码 分配到组合块中,例如
classTop(Generator):def__init__(self):super().__init__("top",True)self.input("in",1)self.output("out",1)pass_through=PassThroughMod()self.add_child("pass",pass_through)self.wire(self["pass"].ports["in"],self.ports["in"])self.add_code(self.code_block)defcode_block(self):self.ports.out=self["pass"].ports.out
我们可以看到生成的verilog会有点冗长:
moduletop(inputlogicin,outputlogicout);logictop$in_0;assigntop$in_0=in;always_combbeginout=top$in_0;endendmodule// top
调试信息也会显示所有信息:
{1:[('/home/keyi/workspace/kratos/tests/test_generator.py',554)],2:[('/home/keyi/workspace/kratos/tests/test_generator.py',556)],3:[('/home/keyi/workspace/kratos/tests/test_generator.py',557)],7:[('/home/keyi/workspace/kratos/tests/test_generator.py',561),('/home/keyi/workspace/kratos/src/expr.cc',455)],8:[('/home/keyi/workspace/kratos/tests/test_generator.py',563)],9:[('/home/keyi/workspace/kratos/tests/test_generator.py',566),('/home/keyi/workspace/kratos/src/expr.cc',485)]}
生态系统
奎托斯有自己的生态系统来用python编写行为verilog。他们中的大多数 是帮助用户调试、原型和测试的插件。
kratos是 建筑五金。奎托斯在Generator中的主要抽象。 Generator可以通过passes随时修改。
zelus是一个有用的库 生成器,如mux和解码器。它们被设计成 尽可能高效。
kratos-debug是供用户使用的图形用户界面 调试生成的verilog。它提供了一个源代码查看器来查看 奎托斯提供。
kratos-dpi是一个dpi插件 允许用户运行任意python代码来模拟systemverilog函数。 这对快速成型和测试非常有帮助。