реклама на сайте
подробности

 
 
> Проброс регистров из одного модуля в другой, SystemVerilog
GREGOR_812
сообщение Jun 24 2016, 23:49
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 37
Регистрация: 26-04-14
Пользователь №: 81 523



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

Суть задачи: есть 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 цепей никаких ошибок не вылазит (или после какого-то числа ошибок компиляция завершается автоматически?) Заранее благодарю за помощь
Go to the top of the page
 
+Quote Post



Closed TopicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th July 2025 - 21:59
Рейтинг@Mail.ru


Страница сгенерированна за 0.01345 секунд с 7
ELECTRONIX ©2004-2016