1. Изменения:
Сценарий OpenSMART:
- Создал переменную $TARGETFILE для файла testbench. Установив эту переменную, я смог выбрать тестовый стенд для работы.
- В функцию run_test добавлена опция -V для создания файла «dump.vcd» для анализа сигналов с помощью gtkwave.
- Исправлены некоторые незначительные проблемы в функции 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 используется элегантным образом для выполнения сопоставления один к одному.
- Определяет 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.
- BenchmarkCycle для установки количества циклов симуляции.
- MeshWidth и MeshHeight для установки размеров топологии Mesh.
- 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. Мысли на следующий день:
[Вопросы]:
- Что такое задержка в полете, это значение печатается в журнале консоли моделирования!
- Как задать желаемое значение скорости закачки? В Types.bsv он определяется следующим образом: typedef 2 InjectionRate; // Скорость закачки: 0.XX . Как сделать скорость впрыска 0,36?
- Как я могу построить график зависимости задержки от скорости внедрения? (Sweep Analysis)
- Моделирование сети 8*8 заняло много времени (~1,5 часа). Как измерить точное время, затраченное на моделирование? И есть ли какие-то оптимизации для сокращения времени симуляции?
[План]:
Понимание fifo, vector, $display (получение (Bits, Eq, FShow)), InputUnit.bsv, OutputUnit.bsv и практические примеры bsv.