1. Изменения:

Сценарий OpenSMART:

  1. Создал переменную $TARGETFILE для файла testbench. Установив эту переменную, я смог выбрать тестовый стенд для работы.
  2. В функцию run_test добавлена ​​опция -V для создания файла «dump.vcd» для анализа сигналов с помощью gtkwave.
  3. Исправлены некоторые незначительные проблемы в функции run_test для поиска правильного каталога для моделирования.
-       ./$BUILDDIR/bdir/sim
+       ./$BUILDDIR/sim -V 

4. В функции verilog и verilog_arg: добавлена ​​опция -vdir для хранения сгенерированных файлов verilog в указанном каталоге (в моем случае это Verilog ).

bsc -verilog -vdir ./Verilog -g mkTestBench -D $1 -aggressive-conditions -no-warn-action-shadowing -simdir $BUILDDIR/bdir -info-dir $BUILDDIR/bdir -bdir $BUILDDIR/bdir -p +:$INCLUDES -       u ./testbenches/$TARGETFILE

2. Взлом скрипта OpenSMART:

Чтобы запустить этот скрипт для компиляции или создания Verilog, передайте ‘-c’ или ‘-v’. Чтобы использовать маршрутизатор SMART, передайте опцию «SMART» в конце.

Например, команда, которая используется для создания Verilog для маршрутизатора SMART: $ ./OpenSMART -v SMART

С точки зрения аргументации:

$0 = ./OpenSMART, $1 = -v. 2 доллара = УМНЫЙ, 4 доллара = *

В операторах case он переходит к -v), затем к *), затем оператор echo вызывает функцию «verilog_arg» и передает ей $2 (SMART).

В функции verilog_arg: она запускает эту команду.

bsc -verilog -vdir ./Verilog -g mkTestBench -D $1 -aggressive-conditions -no-warn-action-             shadowing -simdir $BUILDDIR/bdir -info-dir $BUILDDIR/bdir -bdir $BUILDDIR/bdir -p +:$INCLUDES -u ./     testbenches/$TARGETFILE

Здесь $1 на самом деле $2, переданный в verilog_arg в операторе case. «-D SMART» включает « `ifdef…. Фрагмент SMART endif в коде bsv. Нравится:

`ifdef SMART                                                                                        
import SmartRouterTypes::*;                                                                         
import SmartRouter::*;                                                                              
import SSR_Manager::*;                                                                              
//import SSR_Router::*;                                                                             
//import SSR_Network::*;                                                                            
`else                                                                                               
import BaselineRouter::*;                                                                           
`endif

3. Постановка дела в БСВ

В файле RoutingTypes.bsv оператор case используется элегантным образом для выполнения сопоставления один к одному.

  1. Определяет 5 направление:
typedef Bit#(NumPorts) Direction; // NumPorts = 5 {N S E W L}                                       
                                                                                                    
Direction north_ = 5'b00001;                                                                        
Direction east_  = 5'b00010;                                                                        
Direction south_ = 5'b00100;                                                                        
Direction west_  = 5'b01000;                                                                        
Direction local_ = 5'b10000;                                                                        
Direction null_  = 5'b00000;

2. Определяет ID 5 направления:

typedef Bit#(3) DirIdx;                                                                             
DirIdx dIdxNorth = 3'b000; //0                                                                      
DirIdx dIdxEast  = 3'b001; //1                                                                      
DirIdx dIdxSouth = 3'b010; //2                                                                      
DirIdx dIdxWest  = 3'b011; //3                                                                      
DirIdx dIdxLocal = 3'b100; //4                                                                      
DirIdx dIdxNULL  = 3'b111;

3. Функция, отображающая направление в Idx:

function DirIdx dir2Idx(Direction dirn);                                                            
  let retIdx = case(dirn)                                                                           
                 north_ : dIdxNorth;                                                                
                 east_  : dIdxEast;                                                                 
                 south_ : dIdxSouth;                                                                
                 west_  : dIdxWest;                                                                 
                 local_ : dIdxLocal;                                                                
                 default: dIdxNULL;                                                                 
               endcase;                                                                             
  return retIdx;                                                                                    
endfunction

4. Функция, которая сопоставляет Idx с направлением:

function Direction idx2Dir(DirIdx idx);                                                             
  let retDirn = case(idx)                                                                           
                  dIdxNorth : north_;                                                               
                  dIdxEast  : east_;                                                                
                  dIdxSouth : south_;                                                               
                  dIdxWest  : west_;                                                                
                  dIdxLocal : local_;                                                               
                  default   : null_;                                                                
                endcase;                                                                            
  return retDirn;                                                                                   
endfunction

4. Одна ошибка в базовом коде:

Когда я устанавливаю $TARGETFILE в InputUnitTB.bsv и пытаюсь скомпилировать, я получаю сообщение об ошибке!

InputUnitTB.bsv вызывает getNextVC, определенный в InputUnit.bsv. Эта функция не используется нигде в исходном коде. Что может быть причиной этой ошибки?

5. Настройка вашей сети:

Чтобы настроить сеть для любых требований, нам нужно изменить переменные в Types.bsv.

  1. BenchmarkCycle для установки количества циклов симуляции.
  2. MeshWidth и MeshHeight для установки размеров топологии Mesh.
  3. NumberofUserVCs для установки количества VC на входной порт.

6. Проведение простых тестов и наблюдение:

Я провел две симуляции сети на 100 000 циклов.

Чтобы рассчитать среднюю задержку сети, я сделаю: (общая задержка / общее количество внедренных пакетов)

Для 2*2: средняя задержка = 42829/6083 = 7,04

Для 8*8: средняя задержка = 2437095/126298 = 19,29

Таким образом, по мере увеличения размера сети средняя задержка сети увеличивается из-за того, что увеличивается среднее расстояние между случайной парой отправителей и получателей.

7. Добавлены операторы $display:

Я смог распечатать значения глобальных типов, определенных в Types.bsv, добавив некоторые операторы отображения в InputUnit.bsv внутри правила doInitialize.

$display("NumVCs is: %d", valueOf(NumVCs));                                                     
$display("MaxVCs is: %d", valueOf(NumVCs));                                                     
$display("VCIdx  is of bits: %d", valueOf(TAdd#(1,TLog#(NumVCs))));                                                                                                                               $display("TLog(1) : %d", valueOf(TLog#(1)));

Bluespec предоставляет примитивы, такие как TAdd, TSub, TMul, TDiv, TExp, TLog, TMax, TMin, для работы с числовыми типами. Я обнаружил, что TLog#(3) равен 1, поэтому он округляется до меньшего значения. Далее, ниже имеет смысл:

typedef Bit#(TAdd#(1, TLog#(NumVCs))) VCIdx ;
typedef 8       MeshHeight;                                                                         
typedef 1       NumUserVCs;

Здесь 8 и 1 по умолчанию являются числовыми типами.

Примечание: мы делаем «Типы импорта::; », поэтому все переменные и типы, такие как: NumVCs, MaxVCs, VCIdx, импортируются, и я могу напрямую их использовать.

8. Функции преобразования примитивных типов данных:

9. Подсчет общего количества входных единиц

Для ячеистой сети 2*2 каждый узел будет иметь один маршрутизатор. Каждый маршрутизатор будет иметь 5 портов, поэтому 5 входных блоков. Следовательно, эта сеть будет иметь 20 входных единиц.

Чтобы следовать этому в коде:

// In BaselineRouter.bsv
Vector#(NumPorts, InputUnit)          inputUnits   <- replicateM(mkInputUnit);
//This generates 5 input units for a router.
// In Network.bsv
Vector#(MeshHeight, Vector#(MeshWidth, Router)) routers <- replicateM(replicateM(mkBaselineRouter));
// This generates 4 routers.

10. Мысли на следующий день:

[Вопросы]:

  1. Что такое задержка в полете, это значение печатается в журнале консоли моделирования!
  2. Как задать желаемое значение скорости закачки? В Types.bsv он определяется следующим образом: typedef 2 InjectionRate; // Скорость закачки: 0.XX . Как сделать скорость впрыска 0,36?
  3. Как я могу построить график зависимости задержки от скорости внедрения? (Sweep Analysis)
  4. Моделирование сети 8*8 заняло много времени (~1,5 часа). Как измерить точное время, затраченное на моделирование? И есть ли какие-то оптимизации для сокращения времени симуляции?

[План]:

Понимание fifo, vector, $display (получение (Bits, Eq, FShow)), InputUnit.bsv, OutputUnit.bsv и практические примеры bsv.