在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 6154|回复: 17

[讨论] 奇葩问题:SV里怎么简化定义多bit信号的代码长度

[复制链接]
发表于 2015-10-29 16:24:09 | 显示全部楼层 |阅读模式
200资产
本帖最后由 cmgit 于 2015-11-12 21:19 编辑

问题比较奇葩,描述如下:
在一个基于systemverilog的环境中,我想定义多bit的信号,但是由于一些其他原因,我不能将信号定义为数组,例如“logic [3:0] aaa;”,只能按单bit写成以下这种形式:
logic aaa_3_;
logic aaa_2_;
logic aaa_1_;
logic aaa_0_;
我有好多个需要这样定义的信号,如果展开写,代码显得很繁琐,会出现大片大片的信号定义。
所以我想能不能实现一个这样的功能,预先定义一个参数化的宏或其他的东西(当然得能够填参数),之后通过重复调用这个宏来实现定义多bit信号。
例如,类似这样的调用方式:
`gen_n_bit(aaa, 3, 0)  //第一个参数是信号名,第二参数是msb,第三个参数是lsb。
来满足上面的要求。
自己用试了define和generate相关的几种方式,都没能成功,故求大神指点。
--------------------------------------------------------------------------------
PS:
    谢谢各位回复,那我解释一下为什么不用数组:之前要用automatic的task,task的参数是ref logic类型的,在这种情况下,我试了好多次,这个task ref变量必须是一个完整的变量,如果选数组中的一个bit作为ref参数是会报错的(仿真器irun),所以要把数组拆开做定义。
task的定义:
  task automatic class_a::task_b(ref logic c);
     ...
  endtask

如果我定义了一个数组,logic [31:0] ccc ,而调用task时这样写:
  task_b(ccc[0]);
就会编译错误。当ccc是一个1bit logic变量时,是没问题的。
所以想要拆开定义。
如果这个问题有解,就不用考虑原先提问的那个问题了。

最佳答案

查看完整内容

个人感觉楼主可以定义一个多bit的变量,然后定义task的时候,把整个变量和它的index同时传进去。例如,logic [3:0] aaa; task automatic class_a::task_b(ref logic [3:0] c, input int i); ... endtask 调用时,原来task_b(a[0])改为task_b(a,0) 不知道在楼主那里是否可行,仅从旁观者角度给个建议。
发表于 2015-10-29 16:24:10 | 显示全部楼层
个人感觉楼主可以定义一个多bit的变量,然后定义task的时候,把整个变量和它的index同时传进去。例如,logic [3:0] aaa;
  task automatic class_a::task_b(ref logic [3:0] c, input int i);
     ...
  endtask
调用时,原来task_b(a[0])改为task_b(a,0)
不知道在楼主那里是否可行,仅从旁观者角度给个建议。
发表于 2015-10-29 17:02:57 | 显示全部楼层
为什么不能弄成数组
 楼主| 发表于 2015-10-29 18:32:12 | 显示全部楼层




    谢谢回复,那我解释一下为什么不用数组:之前要用automatic的task,task的参数是ref logic类型的,在这种情况下,我试了好多次,这个task ref变量必须是一个完整的变量,如果选数组中的一个bit作为ref参数是会报错的(仿真器irun),所以要把数组拆开做定义。
task的定义:
  task automatic class_a::task_b(ref logic c);
     ...
  endtask

如果我定义了一个数组,logic [31:0] ccc ,而调用task时这样写:
  task_b(ccc[0]);
就会编译错误。当ccc是一个1bit logic变量时,是没问题的。
所以想要拆开定义。
如果这个问题有解,就不用考虑原先提问的那个问题了。
求助大神,谢谢!
发表于 2015-10-30 01:14:16 | 显示全部楼层
for example:
interface dp_ram_if #
(
        parameter DP_DATA_WIDTH = 16,
        parameter DP_ADDR_WIDTH = 11
);

    logic    user_clk;
    logic    user_we;
    logic    user_en;
    logic    [DP_ADDR_WIDTH - 1 : 0] user_addr;
    logic    [DP_DATA_WIDTH - 1 : 0] user_din;
    logic    [DP_DATA_WIDTH - 1 : 0] user_dout;

    modport core_to_app
    (
        input  user_clk,
        input  user_we,
        input  user_en,
        input  user_addr,
        input  user_din,
        output user_dout
    );
    modport app_to_core
    (
        input  user_dout,
        output user_clk,
        output user_we,
        output user_en,
        output user_addr,
        output user_din
    );

endinterface : dp_ram_if
 楼主| 发表于 2015-10-30 09:14:29 | 显示全部楼层


for example:
interface dp_ram_if #
(
        parameter DP_DATA_WIDTH = 16,
        parameter DP_ADDR_WIDTH = 1 ...
pine_stone 发表于 2015-10-30 01:14




    谢谢您的回答。
但是我这边不是要实现一个参数化的数组定义,我是想实现一个参数化的n位的单bit信号定义。定义形式是这样的:
logic aaa_0_;
logic aaa_1_;
logic aaa_2_;
logic aaa_3_;
...
并非logic [n:0]的形式。
不知道是不是我对您的意思理解有误。
发表于 2015-10-30 09:30:56 | 显示全部楼层
`define DEF_LOGIC_SIGAL(NAME,MSB,LSB) \
        logic [MSBSB] NAME;
发表于 2015-10-30 09:31:06 | 显示全部楼层
`define DEF_LOGIC_SIGAL(NAME,MSB,LSB) \

logic [MSBSB] NAME;
发表于 2015-10-30 10:01:59 | 显示全部楼层
本帖最后由 A1985 于 2015-10-30 10:03 编辑

理解错误,你可以把相关展开都写一遍,不就得了,虽然比较复杂。目前没看到解决方法

  • `define DEF_LOGIC_SIGAL_2(NAME)\

    logic NAME``__1__; \

    logic NAME``__0__;

    • `define DEF_LOGIC_SIGAL_3(NAME)\

      logic NAME``__2__; \

      logic NAME``__0__;

    •         logic NAME``__1__; \

 楼主| 发表于 2015-10-30 15:25:57 | 显示全部楼层


理解错误,你可以把相关展开都写一遍,不就得了,虽然比较复杂。目前没看到解决方法
`define DEF_LOGIC ...
A1985 发表于 2015-10-30 10:01




    谢谢您。目前的做法跟您描述的一样:定义了若干个define,按位宽采用不同的define。我掌握的知识中实在是找不到更好得方法了……
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /3 下一条

×

小黑屋| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-4-23 17:34 , Processed in 0.030931 second(s), 8 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表