当前位置:   article > 正文

平头哥数字电路验证(DV)专家面试题收录_dv验证

dv验证

平头哥数字电路验证(DV)专家面试题收录

#平头哥芯片设计
##一面(视频面试)

一、SystemVerilog基础,constraint问题

       一个64位的起始地址和一个8位的长度,需要随机这两个变量,让每次随机出来的地址空间都和之前的任意一次都没有重叠。例如第一次地址是3,长度是5,第二次地址是20,长度是10,这样就可以,但是第三次如果随机出来地址是15,长度是10就不行。因为和第二次有一部分是重叠的。请问这样的class该怎么设计?

1.1 方案一

  1. class addr_manager;
  2. // 存储所有地址范围的动态数组
  3. typedef struct packed {
  4. longint unsigned start;
  5. byte length;
  6. } addr_range;
  7. // 已分配的地址数组
  8. addr_range region[];
  9. // 方法用于加入新的地址段
  10. function new_region(longint unsigned start, byte length);
  11. addr_range new_region;
  12. new_region.start = start;
  13. new_region.length = length;
  14. if (!check_overlap(new_region)) begin
  15. region.push_back(new_region);
  16. end else begin
  17. $display("Overlap detected: Cannot add range start=%0d length=%0d", start, length);
  18. end
  19. endfunction
  20. // 检查新的地址区域是否与已有区域重叠
  21. function bit check_overlap(addr_range new_region);
  22. foreach (region[i]) begin
  23. if ((new_region.start < (region[i].start + region[i].length)) &&
  24. ((new_region.start + new_region.length) > region[i].start)) begin
  25. return 1;
  26. end
  27. end
  28. return 0;
  29. endfunction
  30. endclass
  31. //你可以通过以下方式使用此类:
  32. module test_module;
  33. initial begin
  34. addr_manager am = new;
  35. // 添加一些测试数据
  36. am.new_region(3, 5);
  37. am.new_region(20, 10);
  38. am.new_region(15, 10); // 这条会检测到重叠并且拒绝
  39. am.new_region(35, 5); // 正常添加
  40. // 确认区域数据
  41. foreach(am.region[i]) begin
  42. $display("Region %0d: Start=%0d, Length=%0d", i, am.region[i].start, am.region[i].length);
  43. end
  44. end
  45. endmodule
  46. //--------------------------------------------------------------------------------------
  47. //在此设计中,每次尝试添加新的地址区域能够先检查是否存在重叠。
  48. //如果检测到重叠,该区域不会被添加到列表中。这样可确保所有地址区域都不会重叠。

1.2 方案二

  1. class NonOverlappingMemoryRegionGenerator;
  2. localparam MAX_ADDRESS = 2**64 - 1; // Max 64-bit address
  3. localparam MAX_LENGTH = 2**8 - 1; // Max 8-bit length
  4. rand bit [63:0] start_address;
  5. rand bit [7:0] length;
  6. constraint no_overlap {
  7. foreach (used_regions[i]) {
  8. // Check that the new region does not overlap with any existing region
  9. !(start_address inside {[used_regions[i].start : used_regions[i].end]})
  10. && !(used_regions[i].start inside {[start_address : start_address + length]});
  11. }
  12. }
  13. mailbox #(region_t) used_regions;
  14. typedef struct {
  15. bit [63:0] start;
  16. bit [63:0] end;
  17. } region_t;
  18. function new();
  19. used_regions = new();
  20. endfunction
  21. task generate_memory_region();
  22. region_t new_region;
  23. new_region.start = start_address;
  24. new_region.end = start_address + length - 1;
  25. forever begin
  26. assert(start_address <= MAX_ADDRESS - length);
  27. assert(length <= MAX_LENGTH);
  28. if (!used_regions.try_put(new_region)) break;
  29. else begin
  30. $display("Overlap detected, retrying...");
  31. `uvm_info(get_type_name(), "Overlap detected, retrying...", UVM_LOW)
  32. end
  33. end
  34. endtask
  35. task get_used_regions(ref region_t regions[$]);
  36. region_t region;
  37. while (used_regions.try_get(region)) begin
  38. regions.push_back(region);
  39. end
  40. endtask
  41. endclass

在这个类中:

•MAX_ADDRESS 和 MAX_LENGTH 定义了最大地址和最大长度的值。

•类成员变量 start_address 和 length 分别用于存储随机生成的起始地址和长度,它们被声明为 rand 类型,以便进行随机化。

•no_overlap 约束确保新生成的内存区域与已使用的区域没有重叠。这通过遍历 used_regions 邮箱中的所有已使用区域,并检查新区域是否在其范围内,以及已使用区域是否在新区域范围内来实现。

•used_regions 是一个 mailbox 类型的变量,用于存储已生成且无重叠的内存区域。每个区域由自定义结构体 region_t 表示,包含起始地址和结束地址。

•构造函数 new() 初始化 used_regions 邮箱。

•generate_memory_region() 任务负责生成新的内存区域。它首先计算新区域的起始和结束地址,然后尝试将新区域放入 used_regions 邮箱。如果放入成功(即无重叠),则跳出循环;否则,继续尝试生成新的随机地址和长度。

•get_used_regions() 任务用于获取当前所有已生成且无重叠的内存区域,将它们存入传递的参考参数数组 regions 中。使用此类时,只需实例化一个 NonOverlappingMemoryRegionGenerator 对象,然后调用其 generate_memory_region() 任务即可生成新的不重叠内存区域。如需查看已生成的所有区域,可调用 get_used_regions() 任务并传入一个空数组来接收这些区域信息。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小桥流水78/article/detail/938563
推荐阅读
相关标签
  

闽ICP备14008679号