обхват на модулен оператор във Verilog

Какъв е обхватът на оператора % във Verilog? В C знам, че ако напиша число% 10, изходът е между 0 и 9. Но опитах във Verilog и резултатът, който получавам, е между -9 и 9? Защо така?

enter code here
module testbench;
integer i;
reg signed [15:0] a,b;
initial
begin
for(i = 0; i < 9; i = i + 1)
begin
    a= $random%10;
    b= $random%20;  
    $display("A: %d and B : %d",a,b);
end
end
endmodule

person Aashish sharma Sharma    schedule 27.02.2017    source източник


Отговори (1)


Modulus може да връща отрицателни числа, както е ясно посочено в IEEE Std 1364-2001 4.1.5 на Verilog Аритметични оператори, както и в IEEE Std 1800-2012 11.4.3 Аритметични оператори

Резултатът от модулна операция приема знака на първия операнд.

И двата LRMs (Езиков справочник) също дават примери.

За да гарантирате положително число, можете да използвате $unsigned(). Пример:

a = $unsigned($random) % 10;

Ако активирате SystemVerilog, можете да замените $unsigned($random) с $urandom или да замените $unsigned($random) % 10 с $urandom_range(9, 0); вижте IEEE Std 1800-2012 18.13 Системни функции за произволни числа и методи


FYI: C/C++ прави същото с отрицателни числа. Вижте въпроси с предишен отговор: Операция по модул с отрицателни числа и Модулен оператор с отрицателни стойности

person Greg    schedule 27.02.2017