这才是最酷的HSL
2赞原谅我标题党了。
时间应该用于核心元素的设计,而不是搭建环境,配置参数,例化模块,写一大堆的 input output end。这些重复的东西浪费了太多精力和时间。
怎么实现HSL,仿真器和综合器根本不支持! 这个需要换个思路,就像Web,Web那Python Ruby PHP JAVA等语言开发,但是浏览器根本不需要解析这些语言,只要大家预定,一个生成HTML JS,另一个解析HTML JS就行。所以HSL没必要让仿真器和综合器支持,只需要生成hdl就行。其实从这点看,拿C C++开发是愚蠢的(不好意思,这里确实需要这个强烈的修饰词)。我呢,则实在Ruby环境下实现,所以就有了Ruby 环境下的HSL。只要有Ruby环境和我开发的HSL包,就完全拥有一样的功能。
我确实正在设计一套HSL(其实也已经在用了)。这套HSL和xilinx的HSL是很不一样的,xilinx只是目前来说是用于做算法,我野心更大,我想全面的彻底的变革FPGA设计思路(虽然有吹NB之嫌,但是这就是我的真实想法,而且正在一步一步的实现中)。
新HSL有很多特性,我摘几个列列(不完全):
1、算法
这个是xilinx宣传的重点,还没写,因为我现在项目还没有用到算法。即使没写也是可以知道这个是最容易实现的功能,算法的语法匹配模式太简单。
2、RTL描述
直白的说就是,实现verilog的always,assign if case 赋值 比较 这些。最终效果看起来和verilog没什么区别。但是确实最难语法词法实现,涉及到很多高级的编程技巧,“惰性赋值”,“元编程”,“回调”,计算符多重重载,等等。这个功能完全是为了让HSL取代 hdl(综合上)。
3、interface的支持
我想做自己的HSL的初衷就是因为 sv 的interface
4、文件管理
verilog没有文件关联,所有的文件引用都是软件实现的,当有两个同名同模块的文件时,verilog是不知道自己引用的是那个。(同名同模块 这种情况是会出现的 特别是多个项目同时进行的时候)。我希望HSL也能解决这个问题
5、"我也不知道取什么名字好"
这个特性够简单容易从代码中看出区别,刚好用来展示HSL的特别之处。
-------------------------------------------------------------------------------------------------------------------------------------
这个代码是配置Xilinx的 Mac IP的他会生成一个system verilog文件,MAC IP使用的是 AXI LITE 配置,应该有不少人用过这个IP
require "hsl" # 先导入库 ## 端口定义 Input :trigger_cfg #用于出发配置 Output :cfg_done #配置完成 AxiLite.master :lite #axi lite 接口 连接到IP的lite ## ======= def config_type_0 # 配置组 0 LITE_WR 0x508 ,0x00002000 # 往0x508地址写入0x00002000 LITE_WR 0x504 ,0x00034800 LITE_MEET 0x504 ,0x00034080 # 循环读取0x504地址的值,直到值等于0x00034080 end def config_type_1 # 配置组 1 LITE_WR 0x508 ,0x00000020 # LITE_WR 0x504 ,0x0003c800 LITE_MEET 0x504 ,0x0003c080 # end def config_type_2 # 配置组 2 LITE_WR 0x508 ,0x00000020 # LITE_WR 0x504 ,0x00030800 LITE_MEET 0x504 ,0x00030080 # end def config_type_3 # 配置组 3 LITE_WR 0x508 ,0x00000020 # LITE_WR 0x504 ,0x0003c800 LITE_MEET 0x50c ,0x00011005 # end lite.EvalList(trigger:trigger_cfg,done:cfg_done) do # 当trigger_cfg为高时执行下面代码 LITE_WR 0x500 ,0x00000045 # 执行完后把cfg_done 拉高 LITE_WR 0x404 ,0x90000000 LITE_WR 0x408 ,0x90000000 LITE_WR 0x508 ,0x90000000 LITE_WR 0x504 ,0x00030800 LITE_RD_MEET 0x504 ,0x00030080 2.times do # 执行2此配置组0 config_type_0 end config_type_1 config_type_2 2.times do # 执行2此配置组3 config_type_3 end end
这就是全部的代码,没有用到很高级的语法,很简洁,可以做到把精力集中到设计逻辑。