Перейти к содержанию
    

verilog-modelsim автоматизация тестирования

Цитата

Есть целая профессия для этого. Верификация. Верификаторы с изумлением смотрят на то, что разглядывание вейвформ считается тестом, и с неподдельным интересуются, умеет ли смотрящий на картинки читать.

Интересное мнение, конечно, жаль, оно не применимо к RTL дев, разве что RTL вериф и то, при условии, что у тебя уже есть нормально описанное окружение с правильно ведущим себя интерфейсом к DUT'у.

Если кто-то сможет написать полностью AXI4 Compliant хотя бы адресную карту без разглядывания вейвформ - я бы на это дело посмотрел)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

5 hours ago, kenezoer said:

Интересное мнение, конечно, жаль, оно не применимо к RTL дев, разве что RTL вериф и то, при условии, что у тебя уже есть нормально описанное окружение с правильно ведущим себя интерфейсом к DUT'у.

Если кто-то сможет написать полностью AXI4 Compliant хотя бы адресную карту без разглядывания вейвформ - я бы на это дело посмотрел)

Какое отношение этот бред имеет к тестированию и к изначальному вопросу?

Про отладку никто не спрашивал.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В 24.11.2022 в 11:44, Вадим Н. сказал:

Testbench, вот сейчас рисую.

Ты что-то затих. Как и всех снегом занесло? )

В 24.11.2022 в 11:44, Вадим Н. сказал:

Он выглядит более структурировано чем предидущие.

Нарисовал - показывай ) Я же тебе свои прислал, ЕМНИП? И не только тестбенчи. Или, глядя на мои, наоборот, застеснялся ? А считай, что ничего и не было: и, вообще, тут нечего стесняться. Все свои, и друг друга учат.

В 24.11.2022 в 11:44, Вадим Н. сказал:

И главное, в нём прописано, что собственно хотелось бы проверить на каждом этапе.

Тем более показывай: что там такого интересного есть. И, вообще, звони голосом (в любое, удобное тебе, время (даже с учётом разницы по времени)): традиция добрая, и её надлежит поддерживать. Чисто по-человечески.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 12/19/2022 at 6:28 PM, Zversky said:

Ты что-то затих.

- переключался на другие задачи. Вот, можно сказать, вернулся к теме ПЛИС. 

Не уверен что мы общались в личке или я скачивал ваши примеры. В любом случае Спасибо )

 

to all

Закину прямо сюда testbench как он был сделан (на момент прыжка в сторону) 

Spoiler
`timescale 1ns / 1ns

/*

	fb_detect_adder module testbench

*/

module testbench();

	reg clk;
	initial clk = 1;
	always #5 clk = !clk;



	event TB_DONE;
	initial @ TB_DONE $stop;
	


	parameter N_ADC = 4;
	parameter N_SAMPLES = 3;

	parameter [N_ADC-1:0] ADC_G = {1'b1, {N_ADC - 1 {1'b0}}}; // Greate than 0
	parameter [N_ADC-1:0] ADC_L = {1'b0, {N_ADC - 1 {1'b1}}}; // Less than 0

	reg areset;
	reg set;
	reg [N_ADC-1:0] adc_data;
	reg adc_data_valid;
	
	wire addr_t1_sgn, addr_t1_sgn_valid;
	wire addr_sgn;
	wire [N_ADC-1:0] addr_abs;
	wire [N_SAMPLES-1:0] addr_tot;
	wire [N_ADC+N_SAMPLES-1:0] addr_sum;
	wire addr_valid;
	
	integer i;
	
	

	initial begin
	
	    $dumpfile("t.vcd");
    	$dumpvars(0, testbench);

		test1;
		test2;
		test3;

		$display("%d> все тесты завершены", $stime);
		#100 -> TB_DONE;
	end
		


	/*
	
		активация uut с определёнными входными значениями
		
		только эта подпрограмма меняет значения
			adc_data
			adc_data_valid
			set
		таким образом, это эмуляция АЦП и fb_detect_hist
	
	*/
	task strobe (input [N_ADC-1:0] strobe_data, input strobe_set);
		begin
			@ (posedge clk)
				adc_data_valid <= 0;
				set            <= 0;
			@ (posedge clk)
				adc_data       <= strobe_data;
				adc_data_valid <= 1;
			@ (posedge clk) 
				adc_data_valid <= 0;
				$display("%d> adc_data_valid", $stime);
			@ (posedge clk)
				set            <= strobe_set;
				if (strobe_set)
					$display("%d> reset статистики", $stime);
			@ (posedge clk)
				set            <= 0;
			repeat (3) @ (posedge clk);
		end
	endtask



	/*
	
		ТЕСТ 1
		
		начальный сброс
		нет сэмплов

		Что проверяется:
		
		сбрасываются все внутренние регистры и выходные порты
		и так всё и стоит пока не начнутся сэмплы
		
	*/    
	task test1;
	begin
		$display("%d> %m", $stime);
		
		// x-state при старте
		repeat (10) @ (posedge clk); // пауза
		
		// сброс uut и входных сигналов
		areset         <= 1;    
		adc_data       <= 0;                    
		adc_data_valid <= 0;                    
		set            <= 0;                    
											   
		fork                                   
			begin: WRITER
			
				// состояние сброса
				repeat (10) @ (posedge clk);
				
				// нормальная работа uut
				areset <= 0;
				repeat (10) @ (posedge clk);
											   
				$display("%d> ...OK", $stime); // тест пройден
				disable READER;
			end
			begin: READER
				@ (posedge addr_valid);
				disable WRITER;
				$display("%d> NOT OK - модуль что-то выдаёт, хотя не должен", $stime);
				-> TB_DONE;
			end
		join
	end
	endtask



	/*
	
		ТЕСТ 2
		
		максимальное число сэмплов одного знака

		Что проверяется:
		
		корректное вычисление статистики;
		в том числе и при максимальном числе сэмплов
		достаточная разрядность суммы наименьших значений
		
	*/
	task test2;
	begin
		$display("%d> %m", $stime);

		fork
			begin: WRITER
				repeat (2 ** N_SAMPLES - 1) strobe (0, 0); // максимальное число сэмплов
				repeat (10) @ (posedge clk);               // пауза
				$display("%d> ...OK", $stime);             // тест пройден
				disable READER;
			end
			begin: READER
				i = 0;
				while (i < 2 ** N_SAMPLES) begin
					@ (posedge addr_valid);
					i = i + 1;
					if (!(
						addr_sgn == 0         &&
						addr_abs == ADC_G     &&
						addr_tot == i         &&
						addr_sum == ADC_G * i
					)) begin
						disable WRITER;
						$display("%d> NOT OK сэмпл %d (%d,\t%d,\t%d,\t%d)", $stime, i, addr_sgn, addr_abs, addr_tot, addr_sum);
						-> TB_DONE;
						disable READER;
					end
				end
				@ (posedge addr_valid);
				disable WRITER;
				$display("%d> NOT OK - сюда не должны попасть", $stime);
				-> TB_DONE;
			end
		join
	end
	endtask



	/*
	
		ТЕСТ 3
		
		максимальное число сэмплов другого знака

		Что проверяется:
		
		корректный ресет статистики;
		достаточная разрядность суммы наибольших значений
		
	*/
	task test3;
		reg all_samples_good;
	begin
		$display("%d> %m", $stime);
		all_samples_good = 0;
		fork
			begin: WRITER
				                            strobe (2 ** N_ADC - 1, 1); // ресет статистики на первом сэмпле
				repeat (2 ** N_SAMPLES - 2) strobe (2 ** N_ADC - 1, 0); // число сэмплов до максимума
				repeat (10) @ (posedge clk);                            // пауза
				if (all_samples_good)                                   // тест пройден
					$display("%d> ...OK", $stime);
				else begin
					$display("%d> NOT OK не все сэмплы обработаны", $stime);
					-> TB_DONE;
				end
				disable READER;
			end
			begin: READER
				i = 0;
				while (i < 2 ** N_SAMPLES - 1) begin
					@ (posedge addr_valid);
					i = i + 1;
					if (!(
						addr_sgn == 1         &&
						addr_abs == ADC_G     &&
						addr_tot == i         &&
						addr_sum == ADC_G * i
					)) begin
						disable WRITER;
						$display("%d> NOT OK сэмпл %d (%d,\t%d,\t%d,\t%d)", $stime, i, addr_sgn, addr_abs, addr_tot, addr_sum);
						-> TB_DONE;
						disable READER;
					end
				end
				all_samples_good = 1;
				@ (posedge addr_valid);
				disable READER;
				$display("%d> NOT OK - сюда не должны попасть", $stime);
			end
		join
	end
	endtask



	fb_detect_adder	
	#(
		.N_ADC     (N_ADC    ),
		.N_SAMPLES (N_SAMPLES)
	)
	uut (
		.areset            (areset           ),
		.clk               (clk              ),
		.adc_data          (adc_data         ),
		.adc_data_valid    (adc_data_valid   ),
		.set               (set              ),
		.addr_t1_sgn       (addr_t1_sgn      ),
		.addr_t1_sgn_valid (addr_t1_sgn_valid),
		.addr_abs          (addr_abs         ),
		.addr_sgn          (addr_sgn         ),
		.addr_tot          (addr_tot         ),
		.addr_sum          (addr_sum         ),
		.addr_valid        (addr_valid       )
	);

endmodule

 

сам модуль тоже прилагаю в архиве. С оговоркой, что это дилетантизм, и проходной пример в процессе поиска решений. Вопросов по нему у меня нет. Но может кому то просто интересно.

exs.7z

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

7 часов назад, Вадим Н. сказал:

Не уверен что мы общались в личке или я скачивал ваши примеры. В любом случае Спасибо )

[00:03, 10.12.2022] Вадим Ш:

[00:03, 10.12.2022] Вадим Ш: да, письмо пришло
[00:04, 10.12.2022] Вадим Ш: А, ну это я уже делал... квеста сим как раз скачивал
[00:05, 10.12.2022] Вадим Ш: ладно, завтра уже буду воевать за звание своих 🙂 а то у меня уже 4 утра :-_

--------------------------------------------------------------

Да, похоже, это я перепутал ))

Но не суть: ничто не мешает заняться, если только есть желание взаимодействовать.

С моей стороны желание есть безотносительно и безусловно: лишь бы на пользу.

Даже хотя бы из того, что мне тут очень сильно помогают, и я считаю своим долгом ещё больше помогать остальным: добро просто обязано прирастать добром ))

7 часов назад, Вадим Н. сказал:

сам модуль тоже прилагаю в архиве.

Там не только модуль, но и TCL. Есть принципиальная разница чем тестировать: икарусом или, например, ментором? Если я протестирую ментором и покажу результаты: будут ли они тебе (можно на ты?) релевантны? Можешь (по моим стопам (расскажу и покажу всё) поставить ментов (квесту) и повторить то, что сделаю я?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...