TRILLER 0 February 8 Posted February 8 · Report post Следующий кусок кода вызывает непонятное мне поведение симулятора Vivado, которое отличается от поведение Modelsim: module top ( input bit clk, input bit i_uno[0:0], input bit i_due[1:0] ); bit a[1:0], b[1:0]; always_ff @(posedge clk) begin for (int i=0; i<2; i++) begin a[i] <= i_due[0]; b[i] <= i_uno[0]; end end Cимулятор Vivado(17.4, 18.3) для неупакованного массива присваивает в такой записи не нулевой элемент входного порта, а весь массив - как будто передаёт по адресу! Т.е. в a[1] будет записано i_due[1], а b[1] и вовсе остаётся равным нулю! Я читал стандарт, но не нашёл подтверждение некорректности своей записи. Ведь согласно определению неупакованный массив отличается только тем, что весь массив нельзя использовать для арифметических операций. Тем более, моделсим данную запись моделирует корректно. Может кто-нибудь сталкивался с подобным и может пояснить, кто в данном случае не прав? Одно дело, если sim Vivado ведёт себя не по стандарту и совсем другое, если и синтезатор позволяет себе вольности! Поведение симуляторов: Спойлер файл и тестбенч: top.sv top_tb.sv Quote Share this post Link to post Share on other sites More sharing options...
one_eight_seven 0 February 8 Posted February 8 · Report post Написано так, чтобы работать непонятно как, результат соотвествует Писатели вивадовского симулятора, кстати, тоже не смогли соответствовать стандарту, и меняют местами блокирующие присванивания на неблокирующие и наоборот как им заблагорассудится. Может быть и в синтезаторе они так же сделали. Поэтому, возьмите любое руководство по стилю кодирования от толковых компаний. Или прочитайте известнейшие в отрасли статьи, например, coding style that kills (http://www.sunburst-design.com/papers/CummingsSNUG2000SJ_NBA_rev1_2.pdf), и следуйте им. Quote Share this post Link to post Share on other sites More sharing options...