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

Добавление даты в проект

Коллеги,

 

проблема такая: на плате имеются семисегментники, очень хочется, что бы при каждой пересборке проекта на них выводилась дата-время или хотя бы некоторый постоянно увеличивающийся номер версии. В Квартусе, к сожалению, нет чего-то похожего на пункт "pre-build", как например в код композере, что бы запустить перед сборкой свою прогу. Верилоговские макросы с выдачей даты или времени, Квартус игнорирует. Пошли путём написания стартового tcl-скрипта, который бы находил в нужном файле предопределённый localparam и менял его, но чего-то не получается никак этот tcl'ник заставить искать нужную строку. Да и тогда запускать сборку проекта придётся не стандартной кнопкой "Start Compilation", а щёлкая по скрипту. Тоже весьма неудобно.

 

Короче говоря, может кто знает как эту задачу проще решить? Поделитесь, плиз, решением!

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


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

В Квартусе, к сожалению, нет чего-то похожего на пункт "pre-build",
Есть это там, только называется оно PRE_FLOW_SCRIPT_FILE и предназначено для запуска tcl-скрипта. Вы его начали писать, и это правильно.

Короче говоря, может кто знает как эту задачу проще решить? Поделитесь, плиз, решением!

Я делал для vhdl.

Файл с версией version.vhd выглядит так (оставлен минимум):

   library IEEE;
   use IEEE.std_logic_1164.all;
   
   package version is
   
   -- Timestamp contains two fields:
   --   (31 downto 8) is a current date (yymmdd). This field is regenerated
   --     automatically before every new compilation.
   --   ( 7 downto 0) is a current build in the current date. This field is increased by 1
   --     automatically before every new compilation. I hope, 255 builds per day is enough :-)
   constant Timestamp     : std_logic_vector (31 downto 0) := x"12052900";
   
   end package version;

 

Скрипт update_version.tcl для обновления версии:

 # update info in the version.vhd file

 # the version update procedure consists of two parts:
 #  1) generate timestamp
 #  2) increment a build number for current timestamp

 #set version_file "[get_project_directory]../rtl/version.vhd"
 set version_file "../rtl/version.vhd"

 # generate timestamp function
 proc generate_timestamp { } {
     return [clock format [clock seconds] -format {%y%m%d}]
 }

 proc update_build_number { timestamp build_number } {
     set current_timestamp [generate_timestamp]
     set str_compare [string compare $timestamp $current_timestamp]

     if { $str_compare == 0 } {
         return [incr build_number 1]
     } else {
         return 1
     }
 }

 proc update_version { input_file output_file } {
     # if the input file can't be opened, return an error
     if { [catch {open $input_file} input] } {
         return -code error $input
     }

     # if the output file can't be opened, return an error
     if { [catch {open $output_file w} output] } {
         return -code error $output
     }

     # read through the input file a line at a time
     while { [gets $input line] != -1 } {
         # line with timestamp
         if { [regexp {^constant Timestamp.*([[:xdigit:]]{8})} $line match prev_timestamp] } {
             # split previous timestamp value to timestamp and build number
             set timestamp [string range $prev_timestamp 0 5]
             set build_number [string range $prev_timestamp 6 7]

             # convert the hexadecimal build_number to base ten
             scan $build_number "%x" new_build_number

             set new_build_number [update_build_number $timestamp $new_build_number]
             set build_number [format "%02X" $new_build_number]
             set timestamp [generate_timestamp]

             regsub $prev_timestamp $line "$timestamp$build_number" line

             post_message -type info "Version is: $timestamp$build_number"
         }

         # write out the line to the new file
         puts $output $line
     }

     close $input
     close $output
 }

 set new_version_file "${version_file}.tmp"

 if { [catch { update_version $version_file $new_version_file } res] } {
     post_message -type critical_warning "Could not update version number: $res"
 } else {
     if { [catch { file rename -force $new_version_file $version_file } res ] } {
         post_message -type critical_warning \
             "Could not update version number: $res"
     }
 }

 

В .qsf пишете:

   # update version number before the flow starts
   set_global_assignment -name PRE_FLOW_SCRIPT_FILE "quartus_sh:update_version.tcl"

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


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

для верилога и времени сборки использовал файл get_time.tcl

project_open -revision pdh_mp_prd_top pdh_mp_prd_top
set t [clock seconds]
set_parameter -name pCOMPILATION_TIME $t
export_assignments

в самом коде

`ifdef MODEL_TECH
  parameter int pCOMPILATION_TIME = 100;
`else
  parameter int pCOMPILATION_TIME;
`endif

 

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


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

Вот для квартуса в .qsf можно воспользоваься PRE_FLOW_SCRIPT_FILE и POST_FLOW_SCRIPT_FILE, а как тот же фокус провернуть в ISE?

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


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

для верилога и времени сборки использовал файл get_time.tcl

Зачем может понадобиться время сборки, сохраненное в переменной/прошивке?

 

 

UPD: вместо «в переменной» следует читать «в параметре».

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

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


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

Я, видимо, сильно протупил. Подумал, что речь идет о длительности сборки, измеренной в секундах.

 

С датой и временем, когда была осуществлена сборка, всё ясно.

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


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

В tclнике сделать параметр derived, во время генерации файлов, значению параметра присвоить время, после чего в виде параметра передать в исходник veriloga. А там уже просто вывести константу на индикатор.

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


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

Вот для квартуса в .qsf можно воспользоваься PRE_FLOW_SCRIPT_FILE и POST_FLOW_SCRIPT_FILE, а как тот же фокус провернуть в ISE?
В исе такого нет, есть в Vivado. Мы для ИСЕ делали tcl-скрипт, в котором проделывались все нужные действия по подготовке даты, и затем скрипт сам запускал синтез (можно отдельно скрипт, затем вручную синтез, и имплементацию, но мы уменьшили ручную работу на 1 клик))) ). Чтобы скрипт выполнить, в ИСЕ открывали окно TCL console, там писали source synt.tcl, и таким образом выполняли всё это дело (т.е. не требовалось отдельно запускать процесс синтеза).

 

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


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

Тоже когда-то делал tcl-скрипт, который изменяет константы в vhdl-файле (время сборки и номер версии) для Altera'-вского проекта.

Но столкнулся со следующей проблемой: если в проекте не было изменений в модуле, который использует эти константы, то при повторном синтезе проекта в Qaurtus константы в итоговой прошивке остаются старыми (я их вывожу на дисплей). При этом константы в vhdl файле изменяются на новые должным образом (здесь все верно).

Проблему решил так, что дополнительно в tcl-скрипте прописал удаление базы данных при каждом синтезе (папка db в проекте). Каких-то серьезных изменений в скорости компиляции не заметил.

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


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

Да, тоже припоминаю, что для Xilinx ISE требовалось очищать проект, иначе всё старое бралось )))

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


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

Для Xilinx есть еще такой вариант: на этапе bitgen добавить время в файл прошивки, а потом через специальный примитив USR_ACCESS получить к нему доступ из работающего проекта.

 

http://www.xilinx.com/support/documentatio..._usr_access.pdf

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


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

Огромное спасибо! Это самый "кошерный" вариант. Остальные - самодельные костыли ))

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


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

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

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

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

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

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

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

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

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

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