2017-08-27 10 views
2

システムのVerilogでアドレスを制約して、そのアドレスが2のべき乗の値になるようにします。例えば、生成されたアドレス(16ビット)Verilogシステムの電源をオフにすると2に等しいアドレスをランダムに割り当てます。

ADDR = 0、2、4、8、16、32 .... 32,768

私のために次の作品であるべきです。しかし、私はそれを行うための他の短くてエレガントな方法を探しています。

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 

答えて

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

彼女はあなたの場合に完全にうまく動作する拘束とクラスのないバリアントです。

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

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

私はあなたが$ urandomがするのではなく、希望する場合は、rndのクラスのランダム化を思い付くことができますね。

2

次のように制約を書いて、ランダム化された値が2のべき乗かどうかを確認できます。

constraint 2_power { 
    (addr != 0) -> (addr & (addr - 1)) == 0; 
} 
関連する問題