i tried to write constraint for below question but didn’t get expected result
Question: Write a constraint on a 32-bit variable such that 7 bits are set consecutively and rest of the bits can also have bits set to 1 but consecutive bit set count cannot exceed 4
My code:
class tb;
rand bit [31:0] a;
int i=0;
constraint a_c{if(a[i]==1){
a[i]==1; a[i+1]==1;a[i+2]==1;a[i+3]==1;a[i+4]==1;a[i+5]==1;a[i+6]==1;a[i+7]==0;}
else if(a[i]==0){
a[i+6]!=7'b1111111;}}
endclass
module tb_top;
tb h;
initial begin
h = new();
//initial begin
repeat(5) begin
h.randomize() with {h.a[0]==1;};
$display("%b", h.a); end
end
endmodule
class tb;
rand bit [31:0] a;
bit[6:0] fixed = 7'h7f;
rand bit[5:0] len1, len2;
rand bit [31:0] q1, q2;
constraint a_c{
len1+len2 == 25;
foreach(q1[i]){
if(i<28 && i+4<len1)
{q1[i+3],q1[i+2],q1[i+1],q1[i]} != 4'hF;
if(i>=len1)
q1[i] == 0;
}
foreach(q2[i]){
if(i<28 && i+4<len2)
{q2[i+3],q2[i+2],q2[i+1],q2[i]} != 4'hF;
if(i>=len2)
q2[i] == 0;
}
}
function void post_randomize();
q2 = q2 << (32-len2);
a = (q2 | (fixed << len1) | q1);
endfunction
endclass
module tb_top;
tb h;
initial begin
h = new();
repeat(5) begin
if(!h.randomize()) $fatal(1, "Randomize Failed");
$display("len1 = %d,len2 = %d, a= %h", h.len1, h.len2, h.a);
end
end
endmodule
can you please explain this? I cant get this
//Below logic worked for me to Generate 7 consecutive ones and there are no more than four consecutive 1’s .
module tb();
class simple;
rand bit[31:0]addr;
rand int value;
constraint c_value{
value inside {[0:25]};
foreach(addr[i]){
if(i inside{[value:(value-1+7)]}){
addr[i] == 1;
}else if (i == value-1 || i == (value+7)){
addr[i] == 0;
} else if (i>3 && i<27){
//addr[i] == 0 || 1;
if({addr[i-1], addr[i-2], addr[i-3], addr[i-4]} == 4'b1111){
addr[i] == 0;
}
//addr[i-:3] != 4'b1111;
}
}
}
endclass
initial begin
simple s= new();
repeat(1) begin
s.randomize();
$display("The value = %0d and addr = %0b", s.value, s.addr);
end
end
endmodule