EgorT 0 19 декабря, 2016 Опубликовано 19 декабря, 2016 (изменено) · Жалоба Не помню, чтобы блок 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 Изменено 19 декабря, 2016 пользователем EgorTol Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
RobFPGA 27 19 декабря, 2016 Опубликовано 19 декабря, 2016 · Жалоба Приветствую! Не помню, чтобы блок 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. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Грендайзер 0 19 декабря, 2016 Опубликовано 19 декабря, 2016 (изменено) · Жалоба В книжках по Verilog прочитал, что initial не синтезируемая конструкция (во всяком случае по стандарту её обязательный синтез не предусматривается). И то, как синтезатор воспримет initial находится на совести производителя софта. Как я понл, альтеровцы довольно ответственно подходят к своему софту, во всяком случае по сравнению с ксайлинксом. Не даром они (xilinx) очень настойчиво предлагают использовать синплифи (говорю про ISE, за виваду не знаю). Вообщем по этому вопросу кое что понял. Leka, EgorTol, RobFPGA спасибо за помощь. А не могли бы вы ещё что нибудь про второй вопрос рассказать? 2) Подскажите пожалуйста вопрос по тестбенчу. Допустим мне надо задать входное воздействие для некоторого модуля. И допустим значений этого вектора много. Естественно прописывать все их в файле тестбенча не удобно и я прописываю их в отдельном .txt файле. Чтение я осуществляю с помощью команд $readmemb и $readmemh которые считывают значения входных данных представленных в двоичном и шестнадцатеричном форматах соответственно. А есть ли способ считывать значения представленные в десятичном формате? Изменено 19 декабря, 2016 пользователем Грендайзер Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
iosifk 3 19 декабря, 2016 Опубликовано 19 декабря, 2016 · Жалоба В книжках по Verilog прочитал, что initial не синтезируемая конструкция (во всяком случае по стандарту её обязательный синтез не предусматривается). И то, как синтезатор воспримет initial находится на совести производителя софта. Как я понл, альтеровцы довольно ответственно подходят к своему софту, во всяком случае по сравнению с ксайлинксом. Не даром они (xilinx) очень настойчиво предлагают использовать синплифи (говорю про ISE, за виваду не знаю). Вообщем по этому вопросу кое что понял. Leka, EgorTol, RobFPGA спасибо за помощь. А не могли бы вы ещё что нибудь про второй вопрос рассказать? Краткий Курс, глава про отладку... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Грендайзер 0 19 декабря, 2016 Опубликовано 19 декабря, 2016 · Жалоба Всё ясно! Спасибо! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Halfback 0 8 октября, 2021 Опубликовано 8 октября, 2021 (изменено) · Жалоба Всем доброго времени суток Столкнулся с непонятно проблемой Ругается на строку 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 Изменено 8 октября, 2021 пользователем Halfback Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
one_eight_seven 3 8 октября, 2021 Опубликовано 8 октября, 2021 · Жалоба Там же английским по белому написано: у вас integer там, где ожидается точка с запятой (;). Смотрите на самый конец предыдущей строки. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Halfback 0 8 октября, 2021 Опубликовано 8 октября, 2021 (изменено) · Жалоба 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) Изменено 8 октября, 2021 пользователем Halfback Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
one_eight_seven 3 8 октября, 2021 Опубликовано 8 октября, 2021 · Жалоба 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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
one_eight_seven 3 8 октября, 2021 Опубликовано 8 октября, 2021 · Жалоба 16 minutes ago, Halfback said: Тогда вопрос сразу - моделсим начал орать что неправильно декларировал массивы I_value Q_value. А как правильно? Ну это не моделсим, а стандарт. Там прямо есть фраза: Quote Variable declaration assignments to an array arenot 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,...}; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Halfback 0 8 октября, 2021 Опубликовано 8 октября, 2021 · Жалоба 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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
one_eight_seven 3 8 октября, 2021 Опубликовано 8 октября, 2021 (изменено) · Жалоба 6 minutes ago, Halfback said: А есть вариант считать и запихать в массив типа вот такого текстового файла? Да. только вам самому надо буден написать обработку разделителей. Преобразования строк в числа в верилоге есть. Погуглите verilog file io operations. Изменено 8 октября, 2021 пользователем one_eight_seven Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
RobFPGA 27 8 октября, 2021 Опубликовано 8 октября, 2021 · Жалоба Приветствую! 6 minutes ago, Halfback said: А есть вариант считать и запихать в массив типа вот такого текстового файла? Ну так $fgetc(), $fgets(), $fscanf(), $sscanf(), ... Удачи! Rob. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Halfback 0 8 октября, 2021 Опубликовано 8 октября, 2021 · Жалоба Господа, спасибо за помощь!!! Считываю файлы вот так. Проверено, работает. Скрытый текст 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]); //проверка Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Halfback 0 13 октября, 2021 Опубликовано 13 октября, 2021 · Жалоба есть еще мелкие вопросики по modelsim. Есть файлик с модулем mod.v и его соотв. тесбенч mod_tb.v Что нужно написать в mod_tb.v чтобы 1.График сразу стал ZoomFull 2.Определенные регистры, обьявленные как беззнаковые, показывались как Decimal а не Bin (почему -то так по умолчанию). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться