吴明

这才是最酷的HSL

1
阅读(494) 评论(3)

    原谅我标题党了

    时间应该用于核心元素的设计,而不是搭建环境,配置参数,例化模块,写一大堆的 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

    这就是全部的代码,没有用到很高级的语法,很简洁,可以做到把精力集中到设计逻辑。

  1. 这就是全部的代码,没有用到很高级的语法,很简洁,可以做到把精力集中到设计逻辑。

  2. 吴总厉害了

  3. 吴总的大杀器终于要出来了。