Я хочу написать простой генератор случайных десятичных чисел из произвольного диапазона.
Я написал следующий код в Verilog:
module randnumgen (clock, r);
input clock;
integer n;
output r;
always @(posedge clock) begin
n <= 0 + {$urandom} % (10 - 0) ;
end
assign r = n;
endmodule
И тестовый стенд:
`timescale 1ns / 1ps
module randnumgen_tb;
// Inputs
reg clock;
// Outputs
wire r;
// Instantiate the Unit Under Test (UUT)
randnumgen uut (.clock,.r);
initial begin
// Initialize Inputs
clock = 1'b1;
end
always #1 clock = ~clock;
endmodule
К сожалению, результат (вывод r
) по-прежнему ведет себя как двоичное число. Мне кажется, я где-то неправильно ввёл тип данных (wire, целый и т.д.). Помогите мне исправить ошибку, пожалуйста.
@mkrieger1 Я только что попробовал указать тип r и указать его в качестве вывода. Не сработало, как также говорит Verilog. Я делаю output integer r;
в модуле и на тестовом стенде. Register is illegal in left-hand side of continuous assignment
и In, out, or inout does not appear in port list: r.
Вы объявили r
только как сигнал шириной 1 бит как на верхнем уровне tb
, так и на randnumgen
. Измените этот стиль объявлений портов:
module randnumgen (input clock, output int r);
int n;
...
endmodule
module randnumgen_tb;
// Inputs
logic clock;
// Outputs
int r;
Убедитесь, что все ваши файлы имеют расширение .sv
. Кроме того, вам следует использовать $urandom_range(maxval,minval)
для генерации случайного числа в диапазоне.
На SystemVerilog действительно все работает. Все-таки хотелось бы иметь дело с простым Verilog. Если существует целочисленная переменная, то наверняка должен быть способ отобразить ее на графике.
Измените int
на reg [31:0]
и $urandom
на $random
, и вы получите устаревший Verilog.
Да, именно это я и сделал в Verilog. Большое спасибо за Вашу помощь! Я принимаю ваш ответ.
@mkrieger1 mkrieger1 Еще не пробовал. Вы имеете в виду
integer r
? Как тогда Verilog поймет, что именноr
является выходным сигналом?