限制随机化,对于 16 位变量,连续 2 位设置为 1,其他位设置为 0

问题描述 投票:0回答:3

我需要编写一个约束来随机化,对于 16 位变量,连续 2 位设置为 1,其他位设置为 0(即 16'b0000_0000_0011、16'b0000_1100_0000 等)。

我尝试使用

$countones
。 它适用于两位,但不适用于连续的 2 位。 它的显示是:

# Value is 10000000000100 
# Value is 10000000010
constraints verilog system-verilog unique-constraint
3个回答
2
投票

一种简单的方法是使用限制在 0 到 14 之间的随机索引变量,然后使用另一个约束仅设置数据的 2 位。

module tb;

class c;
    rand bit [ 3:0] idx;
    rand bit [15:0] data;
    constraint c0 {
        idx < 15;
        data == (3 << idx);
    }
endclass

initial begin
    c c;
    c = new();
    repeat (20) begin
        c.randomize();
        $displayb(c.data);
    end
end

endmodule

输出示例:

0000110000000000
0000011000000000
0000110000000000
0110000000000000
0000110000000000
0000000000110000
0000000110000000
0000110000000000
0000110000000000
0000001100000000
0000000000000011
0000001100000000
0000110000000000
0001100000000000
0000110000000000
0000000110000000
0011000000000000
0000000000110000
0000000000110000
0000001100000000

0
投票
class packet;
  rand bit[15:0] data;
  rand bit[3:0] idx;
  
  constraint c_data { data == 0; }
  
  function void post_randomize();
    data[idx] = 1'b1;
    if(idx == 15) data[0]     = 1'b1;
    else          data[idx+1] = 1'b1;
  endfunction
  
  
  
endclass

module top;
  initial repeat(5) begin 
    packet p; 
    p = new();
    p.randomize();
    $display("%b", p.data);
  end 
endmodule

0
投票
constraint shiftoneminusone {
    num_ones inside {[0:31]}; $countones(x)==num_ones; 
    shift_by inside{[0:31-num_ones]};  //line 637  31@num_ones|....|

    ninetyten==1-> x == ((32'b1 << num_ones) - 1 ) << shift_by;  Ex:{0000_1000}-1={0000_0111}
  }
© www.soinside.com 2019 - 2024. All rights reserved.