GREGOR_812 0 24 июня, 2016 Опубликовано 24 июня, 2016 · Жалоба Приветствую всех Суть задачи: есть 32 таймера, каждый из них имеет 16-разрядный выходной регистр, где хранится текущее значение, вот его упрощённый код: module timer #( parameter TIMER_WIDTH = 16 )( input logic rst_i, input logic clk_i, input logic ena_i, //... output logic [ TIMER_WIDTH - 1 : 0 ] value_o ); always_ff @( posedge rst_i or posedge clk_i ) begin if ( rst_i ) begin value_o <= '0; end else begin if ( ena_i ) begin value_o <= value_o + 1'b1; end end end endmodule И есть модуль с регистрами шириной 8 бит, память под регистры я объявляю вот так: logic [ 2**ADDR_WIDTH - 1 : 0 ][ DATA_WIDTH - 1 : 0 ] regs; Значения, которые получаются в процессе работы таймеров, должны храниться в этом наборе регистров. Как нужно описать межсоединение таймеров с набором регистров так, чтобы не получалось "лишних" регистров? Пытался делать так (упрощённо): module registers #( parameter ADDR_WIDTH = 7, parameter DATA_WIDTH = 8, parameter NUMBER_OF_TIMERS = 32 )( //... input logic [ NUMBER_OF_TIMERS * TIMER_WIDTH - 1 : 0 ] timers_i, output logic [ NUMBER_OF_TIMERS * TIMER_WIDTH - 1 : 0 ] timers_o, //... ); //... genvar i; generate for (i = 0; i < NUMBER_OF_TIMERS; ++i) begin : some assign timers_o[(i + 1) * TIMER_WIDTH - 1 : i * TIMER_WIDTH] = regs[i * 2 + 1 : i * 2]; assign regs[i * 2 + 1 : i * 2] = timers_i[(i + 1) * TIMER_WIDTH - 1 : i * TIMER_WIDTH]; end endgenerate //... Затем в топе: module top ( //... output logic [ NUMBER_OF_TIMERS * DATA_WIDTH * 2 - 1 : 0 ] timers_o, //... ); //... logic [ NUMBER_OF_TIMERS * DATA_WIDTH * 2 - 1 : 0 ] timers_i; genvar i; generate for ( i = 0; i < 32; ++i ) begin : TIMER timer #( TIMER_WIDTH ) tim ( .*, .value_o ( timers_i[ ( ( i + 1 ) * TIMER_WIDTH - 1 ) : ( i * TIMER_WIDTH ) ] ) ); end : TIMER endgenerate registers #( ADDR_WIDTH, DATA_WIDTH, NUMBER_OF_TIMERS ) regs ( .* ); //... В итоге получаю вот такую картину: Не понимаю, откуда ещё берутся драйверы, если их нет. Я даже цепи сброса удалил, причём на остальные 500 цепей никаких ошибок не вылазит (или после какого-то числа ошибок компиляция завершается автоматически?) Заранее благодарю за помощь Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GREGOR_812 0 25 июня, 2016 Опубликовано 25 июня, 2016 · Жалоба Разобрался) всё-таки действительно я невнимательно проверил код, у меня была запись в регистры по адресу, примерно так: regs[addr] <= w_data; Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться