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 StoredProcedureCall 1x Varchar输出1x游标输出   java StackOverflower运行时错误   算法Java基准测试:确保对象在超出范围后不被重用   java在SpringDataNeo4j中使用RelationshipEntity保存节点的正确方法是什么?   命令行参数设置登录java的属性   Java泛型AnyType,如何允许调用任何方法?   java如何检查Html字符串和字符串   sql如何插入一个日期,然后从java执行的存储过程中向oracle数据库中插入的日期添加小时、分钟和秒   java 安卓 3布局相同的活动   安卓应用程序中的java毕达哥拉斯   使用javaw在批处理文件中运行JAR的服务会在process explorer XYNTService中产生多个java进程   java需要在Derby中编写正确的查询   多线程Java在缓存中为多个线程保存变量   持久化java实体引用问题   java在SpringMVC应用程序中使用本地线程安全吗?   JavaSwing,100个文本字段都有类似的任务,所以我想写一个函数来完成这个任务   java我们在新字符串(“literal”)中放置的字符串文字发生了什么变化;   java注入需要在GUI中使用枚举的对象   在Spark SQL中加载JDBC表时java数据不正确