SV随机化 – 使用约束生成不重叠的内存区域

huangapple go评论79阅读模式
英文:

SV randomization - generating non-overlapping memory regions using constraints

问题

以下是您要翻译的部分:

这个约束 if(i!=j) !((regions[i].addr_s >= regions[j].addr_s) && (regions[i].addr_s <= regions[j].addr_e)); 看起来是有效的,但我想确定一下它是否会出现问题。

英文:

I want to generate random regions in memory such that they do not overlap. Below code is generating such regions but they are in order (i.e., region-0 is before region-1, region-1 is before region-2).

But I want to have the regions in random order. I can use shuffle() in post_randomize, but I want to know if we can do this using just constraints ?

  1. class test;
  2. typedef struct{
  3. rand int unsigned indx;
  4. rand bit [31:0] addr_s;
  5. rand bit [31:0] addr_e;
  6. rand bit [31:0] sz;
  7. } regions_t;
  8. rand regions_t regions[];
  9. constraint c_regions{
  10. regions.size() == 3;
  11. foreach(regions[i]) {
  12. regions[i].indx == i;
  13. regions[i].sz inside {10, 20}; // size of each region
  14. regions[i].addr_e == regions[i].addr_s + regions[i].sz - 1;
  15. regions[i].addr_s &lt; regions[i].addr_e;
  16. regions[i].addr_e &lt; 60; // uppler limit of all memory regions
  17. foreach(regions[j]) {
  18. //if(i!=j) !((regions[i].addr_s &gt;= regions[j].addr_s) &amp;&amp; (regions[i].addr_s &lt;= regions[j].addr_e));
  19. if(i&lt;j) (regions[i].addr_e &lt; regions[j].addr_s);
  20. }
  21. }
  22. }
  23. function void post_randomize();
  24. //regions.shuffle();
  25. $display($sformatf(&quot;post_randomize(): regions = %0p&quot;, regions));
  26. endfunction : post_randomize
  27. endclass: test
  28. program prog;
  29. test tst;
  30. initial begin
  31. tst = new();
  32. repeat(10) begin
  33. tst.randomize();
  34. end
  35. end
  36. endprogram: prog

This constraint if(i!=j) !((regions[i].addr_s &gt;= regions[j].addr_s) &amp;&amp; (regions[i].addr_s &lt;= regions[j].addr_e)); seems to be working, but wanted to sure if it will have issues.

答案1

得分: 0

将您最后的内部 foreach 循环更改为以下内容。您已经非常接近了。

  1. typedef bit [7:0] addr_t;
  2. class test;
  3. typedef struct{
  4. int unsigned indx;
  5. addr_t addr_s;
  6. addr_t addr_e;
  7. int sz;
  8. } regions_t;
  9. rand regions_t regions[];
  10. constraint c_regions{
  11. regions.size() == 3;
  12. foreach(regions[i]) {
  13. regions[i].indx == i;
  14. regions[i].sz inside {10, 20}; // 每个区域的大小
  15. regions[i].addr_e == regions[i].addr_s + regions[i].sz - 1;
  16. regions[i].addr_s < regions[i].addr_e;
  17. regions[i].addr_e < 80; // 所有内存区域的上限
  18. foreach(regions[j]) // 起始地址不能在另一个范围内
  19. i!=j -> !(regions[i].addr_s inside {[regions[j].addr_s:regions[j].addr_e]});
  20. }
  21. }
  22. function void post_randomize();
  23. $display($sformatf("post_randomize(): regions = %p", regions));
  24. endfunction : post_randomize
  25. endclass: test
  26. module prog;
  27. test tst;
  28. initial begin
  29. tst = new();
  30. repeat(10) begin
  31. assert(tst.randomize());
  32. end
  33. end
  34. endmodule: prog
英文:

Change your last inner foreach loop to what I show below. You were very close/

  1. typedef bit [7:0] addr_t;
  2. class test;
  3. typedef struct{
  4. int unsigned indx;
  5. addr_t addr_s;
  6. addr_t addr_e;
  7. int sz;
  8. } regions_t;
  9. rand regions_t regions[];
  10. constraint c_regions{
  11. regions.size() == 3;
  12. foreach(regions[i]) {
  13. regions[i].indx == i;
  14. regions[i].sz inside {10, 20}; // size of each region
  15. regions[i].addr_e == regions[i].addr_s + regions[i].sz - 1;
  16. regions[i].addr_s &lt; regions[i].addr_e;
  17. regions[i].addr_e &lt; 80; // upper limit of all memory regions
  18. foreach(regions[j]) // start address cannot be inside another range
  19. i!=j -&gt; !(regions[i].addr_s inside {[regions[j].addr_s:regions[j].addr_e]});
  20. }
  21. }
  22. function void post_randomize();
  23. $display($sformatf(&quot;post_randomize(): regions = %p&quot;, regions));
  24. endfunction : post_randomize
  25. endclass: test
  26. module prog;
  27. test tst;
  28. initial begin
  29. tst = new();
  30. repeat(10) begin
  31. assert(tst.randomize());
  32. end
  33. end
  34. endmodule: prog

huangapple
  • 本文由 发表于 2023年2月10日 05:32:32
  • 转载请务必保留本文链接:https://go.coder-hub.com/75404622.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定