Добавил:
ivanov666
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Языки VHDL и VERILOG в проектировании цифровой аппаратуры
.pdf
Глава 6. Реализация шифроалгоритма RC4 на ПЛИС 201
input [addr_width -1:0]addr ;
output [data_width -1 : 0] do;
reg[data_width -1 : 0] mem[0: depth-1 ]
/* synthesis sin_ramstyle="register" */;//блок памяти
reg [addr_width -1:0]addr_reg ;
integer i;
always @ (posedge clk ) begin
if( en==1) begin
if (rst )addr_reg=0;
else addr_reg=addr;
if (we ==1)begin
mem[addr_reg] = #(TW)di ; do=di; end
else begin do=#(TR) mem[addr_reg];
end
end
end
assign #(TR) do= mem[addr_reg];
endmodule //RAM
// ниже автомат----------------------
`define REG_DELAY 1 // условная задержка регистров
`define IDLE_ST 1 //последовательность кодов состояний
`define R_SI_ST 2// автомата
`define R_SJ_ST 3//
`define W_SJ_ST 4//
`define W_SI_ST 5//
`define R_SIJ_ST 6//
`include "c:\synplicity\synplify\lib\xilinx\virtex.v"
module rc4_ver_pol (clk, rst,datain,dataout,done );
input rst, clk ; input [7:0] datain;//входной байт
output [7:0] dataout;//результат шифрования-дешифрования
output done;//сигнал готовности результата
reg done;reg [7:0] dataout;reg [7:0] i_reg,next_i_reg,j_reg,next_j_reg;
reg [7:0] tmp_si,next_tmp_si,tmp_sj,next_tmp_sj;//tmp_output;
reg [5:0] state,next_state;
reg [7:0] addr; reg we,en,next_en;
reg[7:0]di;wire [7:0]do;
wire [8:0]addr_w={ 1'b0,addr};
//НИЖЕ КОНКРЕТИЗАЦИЯ КОМПОНЕНТЫ ramb4_s8p
/* ramb4_s8p ss (.we( we),.en(en),.rst(rst),.clk(clk),
.addr(addr_w),.di(di),.do(do));
*/
//НИЖЕ КОНКРЕТИЗАЦИЯ КОМПОНЕНТЫ RAMB4_S8
//из библиотеки синтезатора Sinplyfy - она подключена include
RAMB4_S8 ss (.WE( we),.EN(en),.RST(rst),.CLK(clk),
.ADDR(addr_w),.DI(di),.DO(do));
//FSM
always @(state or do or rst or en or tmp_si or
i_reg or j_reg or datain or tmp_sj) begin
next_state=state;
next_i_reg=i_reg;next_j_reg=j_reg;
next_tmp_si=tmp_si;

202 Глава 6. Реализация шифроалгоритма RC4 на ПЛИС
next_tmp_sj=tmp_sj;
next_en =en ;done=0;we=0;dataout=0;
addr=0;di=0;
if (rst==0)begin
case(state)
`IDLE_ST:begin
next_state=`R_SI_ST;
addr=i_reg;
we=0;
next_en=1;
next_i_reg=1; next_j_reg=0;
end
`R_SI_ST: begin
next_state=`R_SJ_ST;
we=0;//далее read пойдет
next_tmp_si= do; //tmp=S[i]
addr= j_reg + do ;//J=J+S[i]
next_j_reg=addr;
end
`R_SJ_ST: begin
next_state=`W_SJ_ST;
next_tmp_sj = do; //tmp=S[ j]
addr=i_reg;
di= do;
we=1;//далее запись пойдет
end
`W_SJ_ST: begin
next_state=`W_SI_ST; // S[ j]=S[i]
addr= j_reg; //j_reg;
di= tmp_si;
we=1;//далее запись пойдет
end
`W_SI_ST: begin
next_state=`R_SIJ_ST; // S[ i]=S[j]
addr= tmp_si +tmp_sj; //S[ j]+S[i]
we=0;//read
next_i_reg= i_reg +1 ;
end
`R_SIJ_ST: begin
next_state=`R_SI_ST;
we=0 ; // далее read пойдет
dataout= datain ^ do;// кодирование ^ xor
// $display( "dataout=%b,time=%t",dataout,$time);
done= 1;//выход готов,вход заблокирован
//i_reg= #(`REG_DELAY) i_reg +1 ;
addr= i_reg ;
end
default: begin next_state=`IDLE_ST; // $display("ERROR STATE \n ");
end

Глава 6. Реализация шифроалгоритма RC4 на ПЛИС 203
endcase
end//rst
end //fsm
// ниже смена состояния автомата
always @( posedge clk)begin
if (rst==1)begin state=`IDLE_ST;
//next_state=`IDLE_ST;
i_reg=1;j_reg=0;en=1;
end
else begin state=next_state;
i_reg=next_i_reg; en=next_en;
j_reg=next_j_reg;
tmp_si= next_tmp_si;
tmp_sj=next_tmp_sj;
end
end
endmodule
6.5.2. Òåñò
При тестировании простым заполнением массива S адресами использован
прием доступа из внешнего модуля к внутренним переменным компоненты.
`timescale 1ns/100ps
module tb_rc4_ver_pol;
parameter debug=1;
reg rst, clk ; reg [7:0] datain;//входной байт
wire [7:0] dataout;//результат шифрования-дешифрования
wire done;//сигнал готовности результата
//ниже конкретизация компоненты
rc4_ver_pol uut (clk, rst,datain,dataout,done );
integer i;
initial begin clk =0 ;repeat (100 )begin #10;clk=~clk;end end
initial begin rst =0 ; #10;rst=1; #42; rst=0; end
initial datain=8'b00001111;
initial for (i=0;i<=255;i=i+1)begin
uut.ss.mem[i]=i;
// uut.ss.RAMB4_S8[i]=i;
if( debug==1)
$display(" i=%d,uut.ss.mem[i]=%d",i,uut.ss.mem[i]);//mem load
// $display("mem[i]=%0d",mem[i]);
end
endmodule//tb_rc4_ver_pol
Упражнения
1. Добавьте в VERILOG-описание автомата инициализацию массива S.
2. Постройте иной тест проверки VERILOG-описания автомата.

204 Глава 6. Реализация шифроалгоритма RC4 на ПЛИС
6.5.3. Peзультаты синтеза
Ниже фрагмент протокола системы синтеза при использовании блочной па-
мяти кристалла.
@I::"c:\synplicity\synplify\examples\verilog\xilinx\rc4_ver_pol_las\rc4_ver_pol.v"
@I:"c:\synplicity\synplify\examples\verilog\xilinx\rc4_ver_pol_las\rc4_ver_pol.v":"c:\synplicity\synplify\lib\xilinx\virtex.v"
Verilog syntax check successful!
File c:\synplicity\synplify\examples\verilog\xilinx\rc4_ver_pol_las\rc4_ver_pol.v changed
- recompiling
Selecting top level module rc4_ver_pol
Synthesizing module RAMB4_S8
Synthesizing module rc4_ver_pol
Extracted state machine for register state
State machine has 6 reachable states with original encodings of:
000001
000010
000011
000100
000101
000110
@END
Process took 0.38 seconds realtime, 0.38 seconds cputime
Setting fanout limit to 100
List of partitions to map:
view:work.rc4_ver_pol(verilog)
Encoding state machine work.rc4_ver_pol(verilog)-state_h.state[5:0]
original code -> new code // новая кодировка состояний !!!!!!
000001 -> 000001
000010 -> 000010
000011 -> 000100
000100 -> 001000
000101 -> 010000
000110 -> 100000
@N:"c:\synplicity\synplify\examples\verilog\xilinx\rc4_ver_pol_las\rc4_ver_pol.v":138:0:138:5|Found counter in
view:work.rc4_ver_pol(verilog) inst i_reg[7:0]
Clock Buffers:
Inserting Clock buffer for port clk, TNM=clk
Net buffering Report for view:work.rc4_ver_pol(verilog):
No nets needed buffering.
Found clock clk with period 8.3333ns
##### START TIMING REPORT #####
Performance Summary
*********************
Requested Estimated Requested Estimated
Clock Frequency Frequency Period Period Slack
clk 120.0 MHz 85.8 MHz 8.3 11.7 -3.3
============================================
Resource Usage Report
Mapping to part: xcv1000cg560-4

Глава 6. Реализация шифроалгоритма RC4 на ПЛИС 205
Cell usage:
FDE 25 uses FD 2 uses
GND 1 use VCC 1 use
XORCY 22 uses MUXCY_L 21 uses
FDRE 8 uses FDR 5 uses
RAMB4_S8 1 use
I/O primitives: OBUF_F_24 9 uses
IBUF 9 uses BUFGP 1 use
I/O Register bits: 0
Register bits not including I/Os: 40 (0%)
RAM/ROM usage summary
BlockRams:1of32(3%) //îäèí áëîê èç 32
Global buffer usage summary
BUFGs + BUFGPs: 1 of 4 (25%)
Mapping Summary: Total LUTs: 94 (0%)
Found clock clk with period 8.3333ns
Mapper successful!
Выводы
Результаты синтеза упрощенного VERILOG-проекта RC4 удовлетворительны.
При реализации памяти на блочной памяти затрачено: один блок памяти (512 × 8)
и 94 LUT (<1 % от ресурсов кристалла), а тактовая частота выше 85 мегагерц при
5 тактах на один байт шифрируемого кода. При реализации памяти автомата на
триггерах получаются худшие результаты — затрачено 2800 LUT и тактовая частота 38 мегагерц.

Глава 7. Функциональная модель
микросхемы двухпортовой синхронной
памяти
В данной главе рассматривается разработка и верификация высокопараметризированной функциональной модели микросхемы памяти, иллюстрируются вопросы описания сложных процессов с контролем временных соотношений
(VHDL-пакет Vital_Timng, VERILOG-блок specify), рассмотрена тестирующая
программа с развитым набором процедур, позволяющих иммитировать различные
режимы работы двух блоков VHDL и двух блоков VERILOG-моделей микросхем.
Показано, что сложность тестирующей программы в реальных проектах совместима со сложностью модели моделируемой системы. Трудоемкость такого
проекта примерно 1,5 человеко-месяца (при тиражировании общих фрагментов в
серии моделей, подобных RAM, она снижается в 3—4 раза.
7.1. Cостояние вопроса
Функциональные модели микросхем памяти: RAM, FIFO и т. п., доступные
вне фирм-разработчиков микросхем, обычно не являются синтезабельными и в
основном предназначаются для использования при верификации моделей систем,
включающих эти компоненты.
Различают два типа функциональных моделей памяти:
— VITAL-совместимые, пригодные для верификации схем после этапа трассировки с учетом задержек в проводниках;
— модели уровня шинного интерфейса (будем называть их просто функциональными или моделями уровня шинного интерфейса (bus functional model), в
основном предназначенные для функциональной верификации RTL-описаний.
Некоторые производители микросхем памяти включают в число свободно распространяемых через Интернет ресурсов не только технические описания (data
sheet), но также и функциональные VERILOG- и VHDL-модели своих микросхем.
В табл. 7.1 в качестве примера приведены данные на конец 2000 года о HDL-моделях микросхем памяти произвольного доступа (RAM) на веб-сайтах таких компаний, как Cypress (www.cypress.com), IDT (www.idt.com) и Micron (www.micron.com
Многие другие компании предоставляют подобный продукт лишь платно. В
их числе компания DENALYsoft — разработчик моделей микросхем памяти, производимых ведущими фирмами. Ее библиотека включает более 3000 моделей
RAM, FIFO и т. п.
Бесплатные модели привлекательны, но лишь при определенных гарантиях их
надежности и точности. Подобные гарантии мы в первую очередь ожидаем от моделей, получаемых от производителей микросхем. Однако в этой части ожидания
как «халявных», так и платных пользователей не всегда оправдываются. Pазработчики микросхем, боясь утечки секретов, не дают потребителям свои синтезабельные модели и разрабатывают функциональные отдельно, часто независимо от
синтезабельных и соответственно не всегда полностью функционально совмести
мые с реальными схемами.
).
-

Глава 7. Функциональная модель микросхемы двухпортовой памяти 207
Хотя для части микросхем (особенно последнего выпуска) модели отсутствуют (см. табл. 7.1), но имеющиеся обычно высоко параметризированы и каждая
модель покрывает несколько функционально подобных микросхем разной емкости или быстродействия. В табл. 7.2 приведены параметры моделей RAM.
Таблица 7.1. Функциональные HDL-модели микросхем RAM
Фирма
Cypress 200 50 50
IDT 150 30 VHDL — не разрабатывают
Micron 200 60 30
Общее число типов
производимых RAM
Таблица 7.2. Некоторые параметры функциональных моделей RAM
Количество
VERILOG-моделей
Количество VHDL-моделей
Параметр модели/Фирма-разработчик Cypress IDT(ver) Micron
Объем памяти + (ver) — +
Длина слова, длина адреса + (ver) — +
Значения задержек + + +
Время выборки + + +
Контроль нарушений рабочих условий (включен
постоянно)
Возможность варьирования задержек внутренних
регистров
Модель выходных задержек max max max
Наличие отладочного режима — — —
Управление выдачей отладочных сообщений на
печать
Наличие неопределенного (Х) значения на выходе
во время переходных процессов
«+» — означает наличие легко варьиируемого параметра;
«–» — означает отсутствие такого параметра;
«on» — параметр присутствует постоянно;
(ver) — имеется только в VERILOG-моделях;
max — модель отражает только максимальную задержку (наихудшим считается максимальная
задержка памяти.
åñòü åñòü åñòü
—— —
—— —
—— —
Параметр «размер памяти» (Memory size) полезен тем, что помогает, например, моделировать неполный объем памяти кристалла и, соответственно, снизить
требования к памяти инструментальной ЭВМ.
Параметр «режим отладки» (debug, message on/off) представляется полезным,
так как во многих случаях не исключено, что модель памяти неверно работает в
особых условиях.
Интересно, что несмотря на усилия по стандартизации HDL-описаний моделей памяти, в том числе разработке новой версии VHDL-стандарта VITAL-2000,
включающей пакеты моделирования RAM , общий стиль пока не наблюдается.
VITAL-пакеты используются в моделях RAM нечасто (см. табл. 7.3). Возможная
причина — вносимое ими снижение скорости моделирования.

208 Глава 7. Функциональная модель микросхемы двухпортовой памяти
Таблица 7.3. Характеристики VHDL-моделей RAM
Характеристика /Производитель
VHDL-моделей
Применение Vital íåò íåò
Применение Vital memory package íåò íåò
Отображение слова памяти типом Std_logic_vector Std_logic_vector
Характеристика /Производитель
моделей
Применение системных процедур типа
$setuphold для контроля временных соотношений
Применение системных процедур для вычисления задержек на путях сигналов
Cypress Micron
Таблица 7.4. Характеристики VERILOG-моделей RAM
Cypress Idt Micron
Äà Äà Äà
Íåò Äà Äà
Как видно из табл. 7.3 и 7.4, Verilog-модели относительно Vital более стандартизованы.
7.2. Некоторые свойства моделей RAM
Защита фирменных секретов не способствует надежности моделей
Модели плохо работают в граничных режимах.
Постоянное отставание сроков выпуска моделей от сроков выпуска микросхем
В частности, оно определяется большой трудоемкостью их создания и верификации (четырехпoртовые RAM с встроенными функциями JTAG требуют 2—4
человекомесяца).
Привязка модели к одному из компиляторов
Например, Cypress Verilog-модели с трехстабильными выходными буферами,
описанными без применения Verilog-примитивов типа buff, bufif, pmos, не проходят на Verilog-XL-симуляторе.
Неэффективное использование памяти инструментальной ЭВМ VHDL-моделями
Verilog-модели расходуют 2 разряда на представление одного бита массива памяти.
VHDL-модели обычно тратят 8 разрядов (байт) на каждый бит моделируемой
памяти при отображении массива как переменной и еще больше в случае отображения сигналом (Cadence-NC VHDL и ModelTech-Modelsim), хотя 4 бит кажется
вполне достаточным даже при использовании 9-значного алфавита std_logic_1164
(см. табл. 7.5). Например, модель 9 mbit RAM (256 k*36) требует 10 000—12 000
килобайт памяти с учетом дополнительных затрат, вызванных неэффективной работой супервизора управления памятью операционной системы.
Одним из методов преодоления этого ограничения является моделирование
слова памяти не вектором, а целым значением.

Глава 7. Функциональная модель микросхемы двухпортовой памяти 209
Таблица 7.5. Способы отображения слова памяти средствами VHDL
Способ отображения слова
n-разрядного памяти
STD_LOGIC_VECTOR 8*n высшая высшая
BIT_VECTOR 8*n низкая высшая
INTEGER 1*n низкая низкая
LONGX_INTEGER 1*n +1 средняя низкая
Требуемое число
áèò
Точность
модели
Скорость
моделирования
(Низкая скорость означает, что присваивание при наличии функции преобразования типа примерно в 20 раз медленнее) variable sdram: mem_std_logic;
sdram( I):=IO;
type mem_int is array (0 t0 10) of integer;
type mem_std_logic is array (0 t0 10) of std_logic_vector( 10 to 0);
variable int_sdram:mem_int;
int_sdram(I):=STD_MEMDATA_TO_longx_integer(IO);
Для большей точности моделирования можно один из разрядов при отображении слова памяти целым (например знаковый) отводить под признак неопределенности. LONGX_INTEGER — это название подразумевает использование подобного приема.
Если хоть один из разрядов записываемого в память слова равен Х, в память
записывается целое число < 0. При чтении такое число конвертируется в код
«все Х» (OTHERS=>'X').
Ниже пример конвертирования
При записи:
Std_logic_vector значение “00000111” конвертируется â 7
“00001X01” â -1(initial'U' )
“00XX1101” â -1
При чтении:
Integer значение 7 â “00000111”
-1 â “XXXXXXXX”
Если слово памяти больше 31 разряда, то можно использовать структуру из
нескольких целых. Пример реализации такого пакета см. ниже.
Нестандартные методы контроля запрещенных режимов
и реализации задержек
Примеры реализации контроля времени предустановки/удержания входного
сигнала средствами HDL.
VHDL
В примере: CLK-тактовый сигнал, IO-шина данных, Tdh-время предустанов
ки данных на шине, Tdh- время удержания, (CE_n = '0') и (WR = '0') и (MRST_n
='1')--условие записи в память.
-

210 Глава 7. Функциональная модель микросхемы двухпортовой памяти
VHDL
a) Без использования пакета Vital_timing
Текст взят из модели микросхемы памяти фирмы Cypress.
-- проверка удержания
Process (CLK'DELAYED(Tdh))
-- процесс запускается задержанным сигналом CLK
BEGIN
IF (CLK'DELAYED(Tdh) = '1') AND (CLK'DELAYED(Tdh)'EVENT)
THEN
ASSERT (IO'LAST_EVENT = 0 ns) OR (IO'LAST_EVENT > Tdh)
REPORT "Hold time violation on Data" SEVERITY Error;
END IF;
END Process;
-- проверка времени предустановки
Process (CLK)
BEGIN
ASSERT (IO'LAST_EVENT >= Tds)
REPORT "Setup time violation on Data bus"
SEVERITY Error;
END IF;
END Process;
Это вариант самой быстродействующей проверки, но зато требующий определенной квалификации от программиста и иногда не свободен от ошибок. Например, если IO — это порт типа INOUT, то эти процессы запускаются не только при
записи в память, но и при чтении. Поэтому возможны ложные выдачи предупреждений о нарушении временных соотношений при чтении.
b) Вариант с использованием стандартной процедуры пакета Vital_Timing.
TimingChecks: PROCESS ( CLK, IO)
--ниже обьявлены вспомогательные переменные
VARIABLE Tviol_IO_CLK : X01 := '0';------set to 'X' when violation
VARIABLE TD_IO_CLK : VitalTimingDataType;
BEGIN
IF (TimingChecksOn) THEN -- если проверка включена
VitalSetupHoldCheck (
TestSignal => IO,-- проверяемый сигнал
TestSignalName => "IO",--имя для сообщения о нарушении
RefSignal => CLK,-- опорный сигнал
RefSignalName => "CLK",--èìÿ
SetupHigh => Tds, --время предустановки 1
SetupLow => Tds,-- время предустановки 0
HoldHigh => Tdh,--время удержания 1 -hold time
HoldLow => Tdh,
CheckEnabled => (CE_n = '0') AND (WR = '0')AND (MRST_n ='1'),
--условие записи в память
RefTransition => '/', --проверять при фронте CLK
HeaderMsg => HeaderMsgText,
--значение этой переменной добавляется к сообщению
TimingData => TD_IO_CLK,
XOn => XOn,--включен режим записи Х при нарушении
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
