 
        
        - •Введение
- •Моделирование поведенческого Verilog-описания
- •Пример и моделирование вентильного описания
- •Создание прогнозного SDF файла в системе “Cadence”
- •Моделирование вентильного описания с файлом задержек, сравнение результатов.
- •Пример описания модуля по подготовке файла с результатами моделирования.
 
Маршрут проектирования БИС
Моделирование вентильного описания с файлом задержек, сравнение результатов.
Моделирование выполняется аналогично моделированию на поведенческом уровне c использованием того же файла оснастки tests.v, в котором надо после ключевого слова initial добавить строку типа:
$sdf_annotate("count5_.sdf",test_t.count5,,,"MAXIMUM","1.0:1.0:1.0","FROM_MTM");
Запуск моделирования аналогичен моделированию на поведенческом уровне:
verilog.exe counter_syn.v tests.v –v Lib.v
Можно просмотреть, как и при моделировании на поведенческом уровне, графические окна выдачи..
Можно в одной оснастке задать все три модели – поведенческую, вентильную c учетом собственной задержки, вентильную c SDF файлом.
Тогда в файле tests.v необходимо описать подключение схем, например:
| count5 | e1(q, data, load, clock, enable, reset); | // поведенческое описание | |
| count5_syn | e2(q_, data, load, clock, enable, reset); | // | вентильное описание | 
| count5_syn | e3(q3s, data, load, clock, enable, reset); | // | вентильное c SDF файлом | 
Соответственно должен быть текст типа:
$sdf_annotate("count5_.sdf",test_t.e3,,,"MAXIMUM","1.0:1.0:1.0","FROM_MTM");
Eсли сделать задание на выдачу:
$gr_waves("clock",clock,"data %d",data,"reset",reset,"q_ver %d",q, // входы и выход повед. модель
| "q_netl %d",q_, | // выход вентильная модель | 
| "q_nSDF %d",q3s,"strob",strob, | // выход вентильная модель с SDF | 
| "testN %d",testnumber); | // номер теста | 
то диаграмма моделирования для такого примера приведена ниже.
14
 
Маршрут проектирования БИС
Сравнение результатов можно осуществлять разными способами. Наиболее простой - вставить в блок posedge strob сравнение сигналов, и выдачу в случае расхождения в файл verilog.log, например:
always @(posedge strob) begin
| if( q != q3s) $display(“Error q get/except %b/%b | test_number $d”,q,q3s,testnumber); | 
end
Если выходов в проекте несколько, то все проверки по выходам надо поместить в этот блок.
15
 
Маршрут проектирования БИС
Пример описания модуля по подготовке файла с результатами моделирования.
Ниже приведен пример описания модуля формирования файла входных воздействий и ответных реакций. Допустим, моделируем проект, у которого следующий список внешних выводов:
D – входная шина, 4 разряда;
DB – двунаправленная шина, 6 разрядов;
OUT – выход, один разряд;
CLK – одиночный входной импульс.
Cигнал управления DB вырабатывается внешним сигналом en.
Ниже приведено описание модуля в файле TESTER.v. Для тестовых векторов
| используются строковые переменные и операторы работы с файлами. | Входные | |
| сигналы в результирующем файле — символы 0 и 1, выходные — | H | и L. | 
| Если тестовые вектора повторяются, то модуль формирует кратность ( | число | |
| после символа “:” ). | 
 | 
 | 
Этот модуль должен быть подключен в тестовую оснастку. Проект имеет имя DESIGN. Маленькими буквами указаны имена цепей. В оснастке должны быть строки, приведенные ниже.
DESIGN DESIGN_1(.CLK(clk),.D(d),.DB(db),.OUT(out));
TESTER TESTER(.CLK(clk),.D(d),.DB(db),.OUT(out),.EN(en));
| // Описание модуля TESTER.v | 
 | 
| `define delta1 | // задержка строба относительно начала теста | 
| `define delta2 | //продолжение строба до конца теста | 
module TESTER (CLK,D,DB,OUT,EN);
input CLK;
input [3:0] D; inout [5:0] DB; output OUT;
reg [8*12:1] tstring; // текстовая строка по всем выводам
reg [8*12:1] oldstring; // предыдущая текстовая строка по всем выводам
reg [8*1:1] Dstr[3:0],DBstr[5:0],OUTstr;
reg tester_clk;
integer r_file;
reg [4:0] i; reg [15:0] povtor;
always begin
#`delta1 tester_clk=1; #`delta2 tester_clk=0;
16
| Маршрут проектирования БИС | 
 | |
| end | 
 | 
 | 
| initial begin | 
 | 
 | 
| r_file=$fopen(“TEST_R.TES”); | 
 | |
| tester_clk=0; povtor=0; oldstring=” “; tstring=” | “; | |
| $fdisplay(r_file,”%%TESTDEF;\n CLK,D,DB,OUT=”); | ||
| end | 
 | 
 | 
| always @(posedge tester_clk) | // всегда по положительному фронту | |
| begin | 
 | 
 | 
| for(i=0; i<4; i=i+1) begin | // входная шина D | 
 | 
| if( D[i]==1’b1) Dstr[i]=”1”; | 
 | |
| else begin if(D[i]==1’b0) Dstr[i]=”0”; | 
 | |
| else Dstr[i]=”X”; | 
 | |
| end | 
 | 
 | 
| for(i=0; i<6; i=i+1) begin | // шина DB | 
 | 
| if(EN==1) begin | // шина – в режиме входа | |
if( DB[i]==1’b1) DBstr[i]=”1”;
else begin if(DB[i]==1’b0) DBstr[i]=”0”; else DBstr[i]=”X”;
end
else begin // шина – в режиме выхода if( DB[i]==1’b1) DBstr[i]=”H”;
else begin if(DB[i]==1’b0) DBstr[i]=”L”; else DBstr[i]=”X”;
end
end
end
if( OUT==1’b1) OUTstr[i]=”H”;
else begin if(OUT==1’b0) OUTstr=”L”; else OUTstr=”X”;
end
tstring={ Dstr[3],Dstr[2], Dstr[1],Dstr[0], // сборка текстовой строки
DBstr[5],DBstr[4], DBstr[3],DBstr[2], DBstr[1],DBstr[0],OUT }; if( tstring == oldstring) povtor=povtor+1;
else if(povtor != 0)
17
Маршрут проектирования БИС
begin
$fdisplay(r_file,”+%s:%d,oldstring,povtor); // выдача в файл
povtor=0;
end
| else $fdisplay(r_file,”+%s,”,tstring); | // выдача в файл | 
oldstring=tstring;
end // конец блока always
Ниже приведен пример текстового файла TEST_R.TES
%TESTDEF;
CLK,D,DB,OUT=
+0101XXXXXX0,
+01010000001,
+01110000001:20,
+1010HHHLLL1,
+1011HLHLLL1:5,
18
