SystemVerilog用户自定义和枚举数据类型

2022-12-29 0 989

采用者自订和隐式正则表达式1.采用者自订类别采用者自订类别URL为typedef,比如typedefintunsigned uint;//unit是自订的正则表达式unit a, b;//用自订的数据类别新闻稿三个表达式看三个范例module type1tb;typedefbit bitt;//自订三个bitt正则表达式 bitt a =;initial$display(“\n\t the value of a is %b”,a);endmodulemodule type2tb; bitt b =1;initial$display(“\n\t the value of b is %b”, b);endmodule在那个范例中,他们只在组件type1tb自订了三个bitt的类别,在组件type2tb中间接采用bitt新闻稿表达式,看一看结论会是什么样的结论显示表达式类别是未明的,假如他们把组件type2tb注解掉,会不能还有那个结论结论获得成功列印这表明,自订的正则表达式bitt的确是获得成功被表述,但他只促进作用于组件type1tb,即使他们并没在组件type2tb再度表述那假如想组件type2tb也能成功列印,能在组件type2tb再次展开三个自订,像这种module type1tb;typedefbit bitt;//自订三个bitt正则表达式 bitt a =;initial$display(“\n\t the value of a is %b”,a);endmodulemodule type2tb;typedefbit bitt;//自订三个bitt正则表达式 bitt b =1;initial$display(“\n\t the value of b is %b”, b);endmodule也能用以后的校对模块域$unitpackage definition;typedefbit bitt;//自订三个bitt正则表达式endpackagemodule type1tb; bitt a =;initial$display(“\n\t the value of a is %b”,a);endmoduleimport definition ::*;//纯虚复制到$unitmodule type2tb; bitt b =1;initial$display(“\n\t the value of b is %b”, b);endmodule能看见,采用者自订类别能局部性表述,也能展开共享资源表述为的是减少源代码的时效性,通常采用者自订的中文名称Niederbronnt,借以界定2.隐式正则表达式2.1基本文本隐式正则表达式的文件格式为:enum {条码名1,条码名2,…}表达式名;隐式能认知为给条码名表达式,或给那个给值三个条码假如没明晰取值正则表达式,隐式中的值是int类别,且值依序是0,1,2…那个情况呢很像非常有限状况机对状况的表述,就像这种://状况表述parameter S0= 3d0;parameter S1= 3d1;parameter S2= 3d2;parameter S3= 3d3;parameter S4= 3d4;换成隐式形式则表示,会单纯许多//状况表述enum {S0,S1,S2,S3,S4} statet;隐式正则表达式中的条码名也能用矢量的形式则表示,能进一步精简//状况表述enum {S[5]} statet;这四个状况表述是同构的除此以外,隐式类别中的值、值类别、值长度也是能自己表述的比如说FSM状况表述时,能用独热码(ont-hot),可以间接表述值//状况表述enumbit [2:]{ S0= 3b001, S1= 3b010, S2= 3b100} statet;这儿要特别注意一点儿,假如他们取值的位宽为3,所以给值时不能远远超过位宽范围2.2隐式类别的表达式隐式类别只能展开下条目达式:隐式类别条目中的三个条码同行业隐式类别的其它表达式(用反之亦然隐式类别新闻稿的表达式)透过cast转化成隐式类别表达式的值用三个隐式类别来表明这两点/*****表达式新闻稿*****/typedefenum {one, two, three}statet;statet state, nextstate;int info;/*****表达式*****/state = one;//用隐式条目中的条码表达式nextstate = state;//同行业隐式类别的其它表达式$cast(nextstate, state +1);//透过cast转化成隐式类别表达式的值这儿有一点儿需要表明,隐式条目中的条码其实是代表三个值(这两点在下文会提到),在那个范例中,值为int型,和info的正则表达式相同,所以存在info = state +1;的写法,但是,state = info +1是不可行的,即使隐式表达式并没给出这种形式此外,state =state +1; state ++等都是不允许的2.3隐式类别专用任务和方法<隐式表达式名>.first:返回指定表达式条目中的第三个成员的值<隐式表达式名>.last:返回指定表达式条目中的最后三个成员的值<隐式表达式名>.next():返回指定表达式条目中后面第N个成员的值,假如到了条目末尾会返回条目开头<隐式表达式名>.prev():返回指定表达式条目中前面第N个成员的值,假如到了条目开头会返回条目末尾<隐式表达式名>.num:返回表达式的隐式条目中元素个数<隐式表达式名>.name:返回隐式表达式中代表那个值的字符串下面依序对这几个情况展开仿真源代码如下:module enumtb;enum {s[9]} statet;initialbegin statet = s5; endinitialbegin$display(“\n\t the initial statet is %0d”, statet);$display(“\n\t <表达式名>.first is %0d”, statet.first);$display(“\n\t <表达式名>.last is %0d”, statet.last);$display(“\n\t <表达式名>.prev(3) is %0d”, statet.prev(3));$display(“\n\t <表达式名>.prev(7) is %0d”, statet.prev(7));$display(“\n\t <表达式名>.next(3) is %0d”, statet.next(3));$display(“\n\t <表达式名>.next(7) is %0d”, statet.next(7));$display(“\n\t <表达式名>.num is %0d”, statet.num);$display(“\n\t <表达式名>.name is %s”, statet.name); endendmodule运行结论如下能看见,自始至终statet均为s5,这几个操作都不能改变statet本身此外,由<表达式名>.prev(7)和<表达式名>.next(7)能看出,这种形式是循环的本文主要参考《SystemVerilog硬件设计及建模》

相关文章

发表评论
暂无评论
官方客服团队

为您解决烦忧 - 24小时在线 专业服务