диапазон оператора модуля в 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 может возвращать отрицательные числа, как четко указано в Verilog IEEE Std 1364-2001 4.1.5 Арифметические операторы, а также в Стандарт IEEE 1800-2012 11.4.3 Арифметические операторы

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

Оба LRM (Language Reference Manual) также содержат примеры.

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

a = $unsigned($random) % 10;

Если вы включите SystemVerilog, вы можете заменить $unsigned($random) на $urandom или заменить $unsigned($random) % 10 на $urandom_range(9, 0); см. IEEE Std 1800-2012 18.13 Функции системы случайных чисел и методы


К вашему сведению: C/C++ делает то же самое с отрицательными числами. См. предыдущие ответы на вопросы: операция по модулю с отрицательными числами и Оператор по модулю с отрицательными значениями

person Greg    schedule 27.02.2017