Jump to content

    
Грендайзер

VERILOG, тест бенч и не только

Recommended Posts

Не помню, чтобы блок initial не инициализировал у меня память в Quartus. Насколько я помню, можно даже файл с инит-данными прочитать.

 

// Quartus II Verilog Template
// Single port RAM with single read/write address and initial contents 
// specified with an initial block

module single_port_ram_with_init
#(parameter DATA_WIDTH=8, parameter ADDR_WIDTH=6)
(
    input [(DATA_WIDTH-1):0] data,
    input [(ADDR_WIDTH-1):0] addr,
    input we, clk,
    output [(DATA_WIDTH-1):0] q
);

    // Declare the RAM variable
    reg [DATA_WIDTH-1:0] ram[2**ADDR_WIDTH-1:0];

    // Variable to hold the registered read address
    reg [ADDR_WIDTH-1:0] addr_reg;

    // Specify the initial contents.  You can also use the $readmemb
    // system task to initialize the RAM variable from a text file.
    // See the $readmemb template page for details.
    initial 
    begin : INIT
        integer i;
        for(i = 0; i < 2**ADDR_WIDTH; i = i + 1)
            ram[i] = {DATA_WIDTH{1'b1}};
    end 

    always @ (posedge clk)
    begin
        // Write
        if (we)
            ram[addr] <= data;

        addr_reg <= addr;
    end

    // Continuous assignment implies read returns NEW data.
    // This is the natural behavior of the TriMatrix memory
    // blocks in Single Port mode.  
    assign q = ram[addr_reg];

endmodule

Edited by EgorTol

Share this post


Link to post
Share on other sites

Приветствую!

 

Не помню, чтобы блок initial не инициализировал у меня память в Quartus. Насколько я помню, можно даже файл с инит-данными прочитать.

Это если выбранный синтезатор поддерживает такое при синтезе.

Увы - инициализация массивов для синтеза в verilog это открытая рана на которую разработчики синтезаторов подсыпают соль с каждой новой версией :(.

Вместо initial можно использовать циклы в generate или в always. Но будет ли это корректно синтезироваться надо проверять в конкретном синтезаторе.

reg [D_WIDTH01:0] mem[0:(2**LEN)-1];

function reg [D_WIDTH-1:0] some_func(int xx);
   some_func= .....; // f(xx)
endfunction

genvar gi;
generate for (gi=0; gi<LEN; gi =gi+1) begin
   assign mem[gi]=some_function(gi);
end
endgenerate

always @(*) begin // or always @(posedge clk)
integer ii;
  for (ii=0;ii<LEN;ii=ii+1) begin
    mem[ii]=some_function(ii);
  end
end

 

Успехов! Rob.

Share this post


Link to post
Share on other sites

В книжках по Verilog прочитал, что initial не синтезируемая конструкция (во всяком случае по стандарту её обязательный синтез не предусматривается). И то, как синтезатор воспримет initial находится на совести производителя софта. Как я понл, альтеровцы довольно ответственно подходят к своему софту, во всяком случае по сравнению с ксайлинксом. Не даром они (xilinx) очень настойчиво предлагают использовать синплифи (говорю про ISE, за виваду не знаю). Вообщем по этому вопросу кое что понял. Leka, EgorTol, RobFPGA спасибо за помощь. А не могли бы вы ещё что нибудь про второй вопрос рассказать?

2) Подскажите пожалуйста вопрос по тестбенчу. Допустим мне надо задать входное воздействие для некоторого модуля. И допустим значений этого вектора много. Естественно прописывать все их в файле тестбенча не удобно и я прописываю их в отдельном .txt файле. Чтение я осуществляю с помощью команд $readmemb и $readmemh которые считывают значения входных данных представленных в двоичном и шестнадцатеричном форматах соответственно. А есть ли способ считывать значения представленные в десятичном формате?
Edited by Грендайзер

Share this post


Link to post
Share on other sites
В книжках по Verilog прочитал, что initial не синтезируемая конструкция (во всяком случае по стандарту её обязательный синтез не предусматривается). И то, как синтезатор воспримет initial находится на совести производителя софта. Как я понл, альтеровцы довольно ответственно подходят к своему софту, во всяком случае по сравнению с ксайлинксом. Не даром они (xilinx) очень настойчиво предлагают использовать синплифи (говорю про ISE, за виваду не знаю). Вообщем по этому вопросу кое что понял. Leka, EgorTol, RobFPGA спасибо за помощь. А не могли бы вы ещё что нибудь про второй вопрос рассказать?

 

Краткий Курс, глава про отладку...

Share this post


Link to post
Share on other sites

Всем доброго времени суток

Столкнулся с непонятно проблемой

Ругается на строку integer i;

Пишет вот что

Error .... near "integer": syntax error, unexpected integer, expecting ';' or ','
Error .... (vlog-2730) Undefined variable: 'i'.

Почему - мне не понятно. Буду благодарен за пояснения

Скрытый текст

 


`timescale 1ns / 1ps

module blablabla_tb;

reg CLK_IN;
reg signed [15:0] D_IN;
reg signed [15:0] IN_I;
reg signed [15:0] IN_Q;

wire CLK_OUT;
wire signed [15:0] D_OUT; 
wire signed [15+2:0] DEB0;
wire signed [15+2:0] DEB1;
wire signed [15:0] DEB2;
wire signed [15:0] DEB3;

	
blablabla u2(
	.clkL(CLK_IN),	
	.clkH(D_IN),
	.inI(IN_I),
	.inQ(IN_Q),
	.outdata(D_OUT),
	.outclk(CLK_OUT),
	.deb0(),
	.deb1(),
	.deb2(),
	.deb3()
	);	

always 
  begin
      CLK_IN = 0;
      #5;
      CLK_IN = 1;
      #5;
  end	

reg signed [15:0] I_value[64-1:0] ={-2,-1,13,23,16,12,7,0,8,1,-18,-16,-11,-10,-3,6,
												10,0,-9,7,24,16,-5,-15,-2,6,-5,1,16,9,-14,-29,
												-21,-4,2,-1,2,0,-10,-5,2,-7,-14,-24,-26,-5,8,11,
												14,10,-5,-11,1,-7,-20,-3,7,-3,-2,0,-8,2,19,6};
reg signed [15:0] Q_value[64-1:0] ={-1,0,2,1,-3,0,6,3,-9,-20,-15,3,12,1,-4,6,
												10,8,-9,-24,0,22,0,-21,-18,-32,-26,7,2,-7,3,-1,
												-3,-2,-16,-14,8,10,-13,-14,16,22,1,-7,3,1,-18,-24,
												-25,-38,-18,11,12,24,32,9,-22,-36,-33,-17,0,-3,-14,-12
												}

integer i;
  
initial 
	begin
	$display("simulate start");  

	for(i = 0; i < 64; i = i + 1)
			begin
			IN_I <= I_value [i];
			IN_Q <= Q_value[i];
			@(negedge CLK_IN);
			end	
	$stop;
	$finish;
	end 
 
endmodule

 

 

 

Edited by Halfback

Share this post


Link to post
Share on other sites

Там же английским по белому написано: у вас integer там, где ожидается точка с запятой (;).  Смотрите на самый конец предыдущей строки.

Share this post


Link to post
Share on other sites
9 минут назад, one_eight_seven сказал:

Там же английским по белому написано: у вас integer там, где ожидается точка с запятой (;).  Смотрите на самый конец предыдущей строки.

да, дейтсвительно, пятница....

Тогда вопрос сразу - моделсим начал орать что неправильно декларировал массивы I_value Q_value. А как правильно?

И еще вопрос - функция чтения массива из файла, допустим, вот такя $readmemb("dI.txt", I_value);

по какому пути будет этот файл искать?

Сунул dI.txt туда же где и файл тесбенча -ан нет, пишет

* Warning: (vsim-7) Failed to open readmem file "dI.txt" in read mode.
# 
# No such file or directory. (errno = ENOENT)

 

Edited by Halfback

Share this post


Link to post
Share on other sites
4 minutes ago, Halfback said:

по какому пути будет этот файл искать?

Вообще, из директории, откуда запускаете симуляцию.

Можете включить поддержку SystemVerilog и проверить (это для линукса):

import "DPI-C" function string getenv(input string env_name);

module top;

  initial begin
    $display("$PWD = %s", getenv("PWD") );
  end
endmodule

 

Share this post


Link to post
Share on other sites
16 minutes ago, Halfback said:

Тогда вопрос сразу - моделсим начал орать что неправильно декларировал массивы I_value Q_value. А как правильно?

Ну это не моделсим, а стандарт. Там прямо есть фраза:

Quote

Variable declaration assignments to an array are
not allowed.

6.2.1 в стандартах 2001 и 2005 годов.

Как правильно именно в верилог?

Вариант 1 - считать из файла.

Вариант 2 (синтезируемый, кстати) :

assign {I_value[0], I_value[1], ...} = {-2, -1, ...};

Вариант 3 - использовать SystemVerilog.

reg signed [15:0] I_value[64-1:0] = '{-2,-1,...};

 

Share this post


Link to post
Share on other sites
22 минуты назад, one_eight_seven сказал:

Вариант 1 - считать из файла.

варантов я так понял два,  $readmemh и $readmemb

Первому значения в HEX надо скормить, второму в бинари

А есть вариант считать и запихать в массив типа вот такого текстового файла? Просто переделывать 16800 точек  в другую запись не очень хочется.

-2,-1,13,23,16,12,7,0,8,1,-18,-16,-11,-10,-3,6

Share this post


Link to post
Share on other sites
6 minutes ago, Halfback said:

А есть вариант считать и запихать в массив типа вот такого текстового файла?

Да. только вам самому надо буден написать обработку разделителей. Преобразования строк в числа в верилоге есть. Погуглите verilog file io operations.

Edited by one_eight_seven

Share this post


Link to post
Share on other sites

Приветствую!

6 minutes ago, Halfback said:

А есть вариант считать и запихать в массив типа вот такого текстового файла?

Ну так $fgetc(), $fgets(), $fscanf(),  $sscanf(), ...

 

Удачи! Rob.  

Share this post


Link to post
Share on other sites

Господа, спасибо за помощь!!!

Считываю файлы вот так. Проверено, работает.

Скрытый текст

	fileI  = $fopen("../../dI.txt","r");
	fileQ  = $fopen("../../dQ.txt","r");

	i=0;
	while (! $feof(fileI)) begin
		$fscanf(fileI,"%d,",I_value[i]);			
		i=i+1;
		end
	$display("read %d I values form file",i-1);
	i=0;
	while (! $feof(fileQ)) begin
		$fscanf(fileQ,"%d,",Q_value[i]);			
		i=i+1;
		end
	$display("read %d Q values form file",i-1);	

	$fclose(fileI);
	$fclose(fileQ);
	
	for(i=0;i<=7;i=i+1) 	$display("%d %d",I_value[i],Q_value[i]); //проверка 

 

 

Share this post


Link to post
Share on other sites

есть еще мелкие вопросики по modelsim. 

Есть файлик с модулем mod.v и его соотв. тесбенч mod_tb.v

Что нужно написать в mod_tb.v чтобы

1.График сразу стал ZoomFull

2.Определенные регистры, обьявленные как беззнаковые, показывались как Decimal а не Bin (почему -то так по умолчанию).

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.