FPS_camel 2024-04-25 17:36 采纳率: 40%
浏览 1

例化covergroup的时候加automatic会有什么效果?

请问在例化covergroup的时候加automatic会有什么效果

以下是我在interface中的一段代码,我发送了5000个数据,wfull会在第4100个数据左右拉高,但在覆盖率中收不到wfull为高,仔细研究了代码及波形,发现他在第1157个周期停止收集覆盖率,删了automatic就正常了。请问是为什么?


covergroup exception_write_cg @(posedge wclk iff wrst_n);
        option.name         = "exception_write";
        option.per_instance = 1;
        coverpoint wfull{
                bins full    = {1};
                bins no_full = {0};
            }
    endgroup : exception_write_cg
    
    covergroup exception_read_cg @(posedge rclk iff rrst_n);
        option.name         = "exception_read";
        option.per_instance = 1;
        coverpoint rempty{
                bins empty    = {1};
                bins no_empty = {0};
            }
    endgroup : exception_read_cg
    initial begin
        if(has_coverage) begin
            automatic exception_write_cg exception_write_cg= new();
            automatic exception_read_cg  exception_read_cg= new();
        end
    end
  • 写回答

4条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-04-25 17:36
    关注

    引自免费微信小程序:皆我百晓生

    在VHDL或Verilog等硬件描述语言中,当在例化covergroup时添加automatic关键字,它会产生一些特定的效果。automatic关键字的作用是在仿真开始时自动创建并初始化相应的covergroup实例。这通常用于简化测试平台的设置,因为它省去了手动创建和关联covergroup对象的步骤。

    然而,在某些情况下,特别是在复杂的系统中,automatic可能会导致意想不到的行为,例如你在问题中所遇到的情况。这可能是由于资源管理、同步问题或者是与仿真器交互的问题。具体到你的例子,当去掉automatic后,覆盖率收集恢复正常,可能是因为手动初始化确保了covergroup实例的正确配置和生命周期管理。

    为了更好地理解问题,我们需要更多关于仿真环境(使用的工具和版本)以及具体仿真行为的细节。但根据你现在提供的信息,一个可能的解决方法是将covergroup的创建和初始化保持手动,并且确保它们在所有相关信号有效之前就已经存在。这样可以避免因信号状态改变过早而错过覆盖率事件。

    这里是修改后的代码示例,移除了automatic关键字,并确保在所有信号可用之后才初始化covergroups:

    library IEEE;
    use IEEE.STD_LOGIC_1164.ALL;
    
    entity your_entity is
        ...
    end entity your_entity;
    
    architecture Behavioral of your_entity is
        signal wclk, wrst_n, rclk, rrst_n: std_logic; -- 假设这些是你使用的信号
        signal wfull, rempty: std_logic; -- 假设这些是你的覆盖点信号
    
        covergroup exception_write_cg @(posedge wclk iff wrst_n);
            option.name         = "exception_write";
            option.per_instance = 1;
            coverpoint wfull{
                bins full    = {1};
                bins no_full = {0};
            }
        endgroup : exception_write_cg
        
        covergroup exception_read_cg @(posedge rclk iff rrst_n);
            option.name         = "exception_read";
            option.per_instance = 1;
            coverpoint rempty{
                bins empty    = {1};
                bins no_empty = {0};
            }
        endgroup : exception_read_cg
    
    begin
        -- 确保在所有信号可用后初始化covergroups
        process (wrst_n, rrst_n)
        begin
            wait until rising_edge(wrst_n) or rising_edge(rrst_n); -- 等待复位信号上升沿
            if (not wrst_n and not rrst_n) then -- 当两者都为低时,表示复位结束
                exception_write_cg <= new(); -- 手动创建并初始化covergroup实例
                exception_read_cg <= new();
            end if;
        end process;
    
        -- 其他实体逻辑...
    
    end Behavioral;
    

    这个修改应该能保证covergroup实例在所有信号稳定后被创建,从而避免可能的覆盖率收集问题。但是,如果你仍然遇到覆盖率问题,建议检查你的覆盖率报告设置是否正确,包括采样频率、触发条件以及是否正确地包含了你的设计模块。另外,确保你的测试平台足够多样化,以便充分覆盖所有的设计情况。

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 4月25日

悬赏问题

  • ¥20 关于URL获取的参数,无法执行二选一查询
  • ¥15 液位控制,当液位超过高限时常开触点59闭合,直到液位低于低限时,断开
  • ¥15 marlin编译错误,如何解决?
  • ¥15 有偿四位数,节约算法和扫描算法
  • ¥15 VUE项目怎么运行,系统打不开
  • ¥50 pointpillars等目标检测算法怎么融合注意力机制
  • ¥20 Vs code Mac系统 PHP Debug调试环境配置
  • ¥60 大一项目课,微信小程序
  • ¥15 求视频摘要youtube和ovp数据集
  • ¥15 在启动roslaunch时出现如下问题