Перейти к содержанию
    

Проброс регистров из одного модуля в другой

Приветствую всех

 

Суть задачи: есть 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 ( .* );
  //...

В итоге получаю вот такую картину:

image.png

Не понимаю, откуда ещё берутся драйверы, если их нет. Я даже цепи сброса удалил, причём на остальные 500 цепей никаких ошибок не вылазит (или после какого-то числа ошибок компиляция завершается автоматически?) Заранее благодарю за помощь

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Разобрался) всё-таки действительно я невнимательно проверил код, у меня была запись в регистры по адресу, примерно так:

regs[addr] <= w_data;

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Гость
Эта тема закрыта для публикации ответов.
×
×
  • Создать...