kratos是一种嵌入python的快速硬件设计语言。

kratos的Python项目详细描述


Build StatusPyPI - FormatPyPI - VersionDocumentation Status

克雷多斯是用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函数。 这对快速成型和测试非常有帮助。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java FloatingAction按钮与RecyclerView中的CardView重叠   java如何计算CardLayout中的卡数   从远程系统上传MySQL数据库并访问Java应用程序   java调用堆栈如何处理带或不带返回类型的递归?   Springboot中的java组计数聚集   java如何在javafx textarea中使用richtextfx   获取与Mockito相关的错误时出现Java问题   java如何将JaxRS响应转换为Wiremock响应   Hadoop集群java。net ConnectionException:连接被拒绝错误   java如何加载文件私有文件类型是pem   java在元空间中的提升和加载的类   如何将系统属性传递给从HTML启动的Java小程序   java如何从网页中获取值并在主类中使用它?安卓应用   java在春天,advisor和aspect之间有什么区别?   java如何检测文件是否已重命名?   java消息驱动Bean何时使用