Jump to content
    

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

Цитата

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

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

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

Share this post


Link to post
Share on other sites

5 hours ago, kenezoer said:

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

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

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

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

Share this post


Link to post
Share on other sites

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

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

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

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

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

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

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

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

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

 

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

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

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

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

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

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

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

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

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

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

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

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

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...