2017-08-27 7 views
2

Je veux contraindre une adresse dans le système Verilog afin que l'adresse est égale à deux la puissance de la valeur. par exemple l'adresse générée (16 bits) doit êtreSystème Verilog randomize adresse égale à 2 à la mise hors tension

addr = 0, 2, 4, 8, 16, 32 .... 32768

Les ouvrages suivants pour moi. Cependant, je cherche n'importe quelle autre manière courte et élégante de le faire.

class two_power_addr; 
    rand bit [15:0] addr; 
    bit [15:0] temp; 

    constraint c_addr { 
    addr == temp; 
    } 

endclass 

module tb(); 
    two_power_addr c; 

    initial begin 
    c=new(); 
    c.temp=0; 
    c.randomize(); 
    $display("%0d \n", c.addr); 
    c.temp=16'h2; 
    for(int i=0; i<10; i++) begin  
     c.randomize(); 
     c.temp=c.temp<<1; 
     $display("%0d \n", c.addr); 
    end 
    end 
endmodule 

Répondre

1
constraint c_addr { $onehot0(addr) == 1; } 
0

Son est une variante sans contraintes et classes qui fonctionne parfaitement bien dans votre cas.

bit[3:0] rnd; 
logic address[15:0]; 

rnd = $urandom; 
address = 16'b1 << rnd; 

Je suppose que vous pouvez trouver une classe pour randomization rnd si vous le souhaitez au lieu de urandom de $.

2

Vous pouvez écrire votre contrainte comme suit pour vérifier si la valeur randomisée est de 2 puissance ou non.

constraint 2_power { 
    (addr != 0) -> (addr & (addr - 1)) == 0; 
}