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

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

Не помню, чтобы блок 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

Изменено пользователем EgorTol

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


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

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

 

Не помню, чтобы блок 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.

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


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

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

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

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


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

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

 

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

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


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

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

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

Ругается на строку 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

 

 

 

Изменено пользователем Halfback

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


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

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

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


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

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)

 

Изменено пользователем Halfback

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


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

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

 

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


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

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,...};

 

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


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

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

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


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

6 minutes ago, Halfback said:

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

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

Изменено пользователем one_eight_seven

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


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

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

6 minutes ago, Halfback said:

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

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

 

Удачи! Rob.  

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


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

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

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

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

	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]); //проверка 

 

 

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


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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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