module TdlSpace::VarElemenAttr

Public Instance Methods

_io_map(tdl_key,hdl_key,default_value,flag,other=nil) click to toggle source
# File lib/tdl/rebuild_ele/ele_base.rb, line 194
def _io_map(tdl_key,hdl_key,default_value,flag,other=nil)
    interface_io = get_class_var('origin_interface_io',{})
    interface_io[tdl_key.to_s] = [hdl_key.to_s,default_value,flag,other]
    set_class_var('origin_interface_io',interface_io)

    ## 定义实例方法
    self.class_exec(tdl_key) do |tdl_key|
        define_method(tdl_key) do 
            rel = self.instance_variable_get("@_#{tdl_key}_") || default_value
            rel || TdlSpace::ArrayChain.create(obj:"#{self.inst_name}.#{hdl_key}", belong_to_module: belong_to_module)
        end

        define_method("#{tdl_key}=") do |arg|
            self.instance_variable_set("@_#{tdl_key}_",arg)
        end

    end
end
clock_io_map(tdl_key,hdl_key,default_freqM=nil) click to toggle source
# File lib/tdl/rebuild_ele/ele_base.rb, line 148
def clock_io_map(tdl_key,hdl_key,default_freqM=nil)
    _io_map(tdl_key,hdl_key,nil,"clock",default_freqM)
     ## 定义实例方法
     self.class_exec(tdl_key) do |tdl_key|
        define_method('clock') do 
            rel = self.instance_variable_get("@_#{tdl_key}_")
            if !dimension || dimension.empty?
                rel || TdlSpace::ArrayChain.create(obj:"#{self.inst_name}.#{hdl_key}", belong_to_module: belong_to_module)
            else  
                rel || TdlSpace::ArrayChain.create(obj:"#{self.inst_name}[0].#{hdl_key}", belong_to_module: belong_to_module)
            end
        end

        define_method("clock=") do |arg|
            self.instance_variable_set("@_#{tdl_key}_",arg)
        end

    end
end
comm_io_map(tdl_key,hdl_key,default_value=nil) click to toggle source
# File lib/tdl/rebuild_ele/ele_base.rb, line 184
def comm_io_map(tdl_key,hdl_key,default_value=nil)
    _io_map(tdl_key,hdl_key,default_value,nil)
end
comm_io_maps_same(*tdl_keys) click to toggle source
# File lib/tdl/rebuild_ele/ele_base.rb, line 188
def comm_io_maps_same(*tdl_keys)
    tdl_keys.each do |e|
        comm_io_map(e,e,nil)
    end
end
gen_sv_interface(path) click to toggle source

生成 SV 文件

# File lib/tdl/rebuild_ele/ele_base.rb, line 235
def gen_sv_interface(path)
    File.open(File.join(path,get_class_var('hdl_name')+".sv"),'w') do |f|

        inerface_params = get_class_var('origin_interface_params',{})

        par_str = []
        inerface_params.each do |k,v|
            par_str << "    parameter #{v[0]} = #{v[1]}"
        end

        interface_io = get_class_var('origin_interface_io',{})

        clock_reset_str = []
        sdata_str = []
        pdata_str = []
        interface_io.each do |k,v|
            ## 查找clock reset
            if v[2]=="clock" || v[2]=="reset"
                clock_reset_str << "    input #{v[0]}"
            end 

            ## 单信号
            if v[2] == "sdata"
                sdata_str << "logic #{v[0]};"
            end

            ## 多信号
            if v[2] == "pdata"
                dv = v[3]
                
                dv.map! do |e| 
                    if inerface_params.keys.include?(e.to_s )
                        inerface_params[e.to_s][0]
                    else 
                        e.to_s
                    end
                end 

                dv_str = dv.map do |e| 
                    "[#{e}-1:0]"
                end.join() 

                pdata_str << "logic #{dv_str} #{v[0]};"
            end

        end

        if par_str.any?
            par_str = "#(\n#{par_str.join(",\n")}\n)"
        else 
            par_str = ''
        end

        if clock_reset_str.any? 
            clock_reset_str = "\n"+clock_reset_str.join(",\n")+"\n"
        else  
            clock_reset_str = ''
        end

        if sdata_str.any? 
            sdata_str = "\n"+sdata_str.join("\n")+"\n"
        else 
            sdata_str = ""
        end

        if pdata_str.any? 
            pdata_str = "\n"+pdata_str.join("\n")+"\n"
        else  
            pdata_str = ''
        end

        interface_modports = get_class_var('interface_modports',[])

        sub_modport = []
        interface_modports.each do |e|
            interface_modport_signals_in  = get_class_var("#{e}_interface_modport_signals_input",[])
            interface_modport_signals_out = get_class_var("#{e}_interface_modport_signals_output",[])
            sub_modport << "modport #{e} (\n"

            xsub_modport = []
            xsub_modport += interface_modport_signals_in.map do |m| 
                if inerface_params.keys.include?(m.to_s )
                    inerface_params[m.to_s][0]
                else 
                    m.to_s
                end 
            end.map do |m| 
                "input #{m}"
            end
    
            xsub_modport += interface_modport_signals_out.map do |m| 
                if inerface_params.keys.include?(m.to_s )
                    inerface_params[m.to_s][0]
                else 
                    m.to_s
                end 
            end.map do |m| 
                "output #{m}"
            end


            sub_modport <<  xsub_modport.join(",\n")
            sub_modport << "\n);\n"
        end

        if sub_modport.any? 
            sub_modport = sub_modport.join('')
        else  
            sub_modport = ''
        end 
        
       
        f.puts "interface #{get_class_var('hdl_name')} #{par_str} (#{clock_reset_str});#{sdata_str}#{pdata_str}"
        f.puts sub_modport
        f.puts "endinterface:#{get_class_var('hdl_name')}"
    end 
end
get_class_var(name,default=nil) click to toggle source

hdl_name :axi_stream_inf modports :master,:slaver,:mirror,:mirror_out param_map :dsize,'DSIZE',8 ## <tdl_key><hdl_key><default_value> clock_io_map :aclk,:aclk,100 ## <tdl_key><hdl_key><default_freqM> reset_io_map :aresetn,:aresetn sdata_maps :axis_tvalid,:axis_tready,:axis_tuser pdata_map :axis_tdata, pdata_map :axis_tkeep,[] pdata_map :axis_tcnt

# File lib/tdl/rebuild_ele/ele_base.rb, line 20
def get_class_var(name,default=nil)
    # begin
    #     instance_variable_get("@_#{name}_")
    # rescue
    #     instance_variable_set("@_#{name}_",nil)
    # end

    unless instance_variable_get("@_#{name}_")
        instance_variable_set("@_#{name}_",default)
        container = instance_variable_get("@_#{name}_")
    else
        container = instance_variable_get("@_#{name}_")
    end
    
    return container
end
hdl_name(name,*nicknames) click to toggle source
# File lib/tdl/rebuild_ele/ele_base.rb, line 43
def hdl_name(name,*nicknames)
    # @@__hdl_name__ = name.to_s
    set_class_var('hdl_name',name.to_s)

    ## 给 sdlmodule 定义例化方法
    ## 例化名
    ## 比如 sv  接口 axi4,可以在tdl里面这样用 axi4() ; `name`=axi4
    self.class_exec(name) do |name|
        SdlModule.class_exec(name,self) do |name,ele_class|
            define_method(name) do |args={}|
                hash = args || {}
                hash[:belong_to_module] = self
                rel = TdlSpace::DefEleBaseArrayChain.new(hash)
                rel.tclass = ele_class
                return rel
            end

            nicknames.each do |nn|
                alias_method nn,name
            end
        end

        _self = self

        TdlSpace::DefPortArrayChain.class_exec(name,self) do |name,ele_class|
            define_method(name) do 
                rel = TdlSpace::DefPortEleBaseArrayChain.new(ele_class,belong_to_module)
                return rel
            end

            nicknames.each do |nn|
                alias_method nn,name
            end

        end
    end

    ## 给例化模块时的 SdlInstPortSugar 添加 方法
    SdlInstPortSugar.class_exec(name,nicknames)  do |name,nicknames|
        define_method(name) do 
            return self
        end

        nicknames.each do |ne|
            define_method(ne) do 
                return self 
            end
        end
    end
end
modports(*args) click to toggle source
# File lib/tdl/rebuild_ele/ele_base.rb, line 94
def modports(*args)
    # @@__interface_modports__ ||= []
    # @@__interface_modports__ += args
    interface_modports = get_class_var('interface_modports',[])
    interface_modports += args 
    set_class_var('interface_modports',interface_modports)

    args.each do |e|
        # puts ("modport_#{e}_input")
        define_singleton_method("modport_#{e}_input") do |*xargs|
            interface_modport_signals = get_class_var("#{e}_interface_modport_signals_input",[])
            interface_modport_signals += xargs
            interface_modport_signals.uniq!
            set_class_var("#{e}_interface_modport_signals_input",interface_modport_signals)
        end

        define_singleton_method("modport_#{e}_output") do |*xargs|
            interface_modport_signals = get_class_var("#{e}_interface_modport_signals_output",[])
            interface_modport_signals += xargs
            interface_modport_signals.uniq!
            set_class_var("#{e}_interface_modport_signals_output",interface_modport_signals)
        end

    end

end
param_map(tdl_key,hdl_key,default_value=nil) click to toggle source
# File lib/tdl/rebuild_ele/ele_base.rb, line 121
def param_map(tdl_key,hdl_key,default_value=nil)
    interface_params = get_class_var('origin_interface_params',{})
    interface_params[tdl_key.to_s] = [hdl_key.to_s,default_value]
    set_class_var('origin_interface_params',interface_params)

    ## 定义实例方法
    self.class_exec(tdl_key,hdl_key) do |tdl_key,hdl_key|
        define_method(tdl_key) do 
            rel = self.instance_variable_get("@_#{tdl_key}_")
            unless rel 
                TdlSpace::ArrayChain.create(obj: "#{inst_name}.#{hdl_key}".to_nq, belong_to_module: belong_to_module)
            else 
                rel 
            end
        end

        define_method("#{tdl_key}=") do |arg|
            self.instance_variable_set("@_#{tdl_key}_",arg)
        end

        define_method(hdl_key) do 
            self.send(tdl_key)
        end

    end
end
pdata_map(name,dimension=[]) click to toggle source
# File lib/tdl/rebuild_ele/ele_base.rb, line 224
def pdata_map(name,dimension=[])
    _io_map(name,name,nil,'pdata',dimension)
    self.class_exec(name) do |e|
        define_method(e) do 
            TdlSpace::ArrayChain.create(obj:"#{self.inst_name}.#{e}", belong_to_module: belong_to_module)
        end
    end
end
reset_io_map(tdl_key,hdl_key,active='low') click to toggle source
# File lib/tdl/rebuild_ele/ele_base.rb, line 168
def reset_io_map(tdl_key,hdl_key,active='low')
    _io_map(tdl_key,hdl_key,nil,"reset",active.to_s.downcase)
     ## 定义实例方法
     self.class_exec(tdl_key) do |tdl_key|
        define_method('reset') do 
            rel = self.instance_variable_get("@_#{tdl_key}_")
            rel || TdlSpace::ArrayChain.create(obj:"#{self.inst_name}.#{hdl_key}", belong_to_module: belong_to_module)
        end

        define_method("reset=") do |arg|
            self.instance_variable_set("@_#{tdl_key}_",arg)
        end

    end
end
sdata_maps(*args) click to toggle source
# File lib/tdl/rebuild_ele/ele_base.rb, line 213
def sdata_maps(*args)
    args.each do |e|
        _io_map(e,e,nil,'sdata',nil)
        self.class_exec(e) do |e|
            define_method(e) do 
                TdlSpace::ArrayChain.create(obj:"#{self.inst_name}.#{e}", belong_to_module: belong_to_module)
            end
        end
    end
end
set_class_var(name,value) click to toggle source
# File lib/tdl/rebuild_ele/ele_base.rb, line 37
def set_class_var(name,value)
    # rel = get_class_var(name)
    instance_variable_set("@_#{name}_",value)
    container = instance_variable_get("@_#{name}_")
end