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

OM-S

Участник
  • Постов

    22
  • Зарегистрирован

  • Посещение

Весь контент OM-S


  1. Для vsim дополнительно указать параметр -t с нужной точностью (fs, ns, ...) . Типа vsim -t fs .... Как Вы и делали. Должно работать... Вот такой запуск точно работает: vsim -L com_library -l transcript.txt -i -t ps -multisource_delay latest +typdelays com_library.test_clk(arc)
  2. Если я правильно понял вопрос, то Вы хотите, чтобы вектор reg [31:0] addr_offset = 'h10000000; переданный в таск c параметром reg addr [0:31] (неупакованный массив!) имел значение addr [0:31] = 'h00000008 (то есть addr[28] ==1 так же как и в исходном addr_offset [28]==1) Вариант решения для sv - использовать {<<{}}: logic [31:0] addr_offset; logic addr_tmp [0:31]; logic dout [0:31]; task demo_task(input logic addr[0:31], output oo [0:31]); oo = addr; endtask assign addr_offset = 'h10000000; assign addr_tmp = {<<{addr_offset}}; always_comb begin demo_task(addr_tmp, dout); end Приведенный пример в Вивадо моделируется и синтезируется.
  3. А если написать вот так: wire nextBit = counter < 4 ? in : feedback; И заодно в тестбенче лучше генерить клок так: initial begin clk <= 0; forever #5 clk <= ~clk; end
  4. Да, конечно, нужно сделать синхонную загрузку или обнуление (что вам нужно по заданию) счетчика. Делаете дополнительный вход (reset, например) и по нему обнуляете. А если совсем по простому, то можно попробовать так (по крайней мере в sv) module count (input clk, output reg [1:0]counter = 0); always @(posedge clk) counter <= counter + 1; endmodule
  5. Задайте начальное значение счетчику (обнулите). Вы же сигналу clk в тестбенче задали начальное значение перед инверсией.
  6. В tb.v поставьте начальное значение для регистра clk, иначе инверсия неизвестного значения даст неизвестное значение Не могу запустить ваш пример и проверить, но в в macros.do наверно нужно указать симуляцию с разрешением 1ps.(строка 4 vsim -t 1ps tb). Pll обычно симулируются с пикосекундными разрешениями.
  7. Расизм я вижу между параллельными fork-ами и собственно захватом данных в фифо по фронту aclk. begin ... 1: rand_pulse = 1; 5: rand_pulse = 0; @(posedge aclk); ... end и begin ... s_axis_tvalid = rand_pulse; if (rand_pulse) s_axis_tdata = $urandom_range(255,0); @(posedge aclk); ... end Какой из блоков выполнится первым и какое значение (старое или новое) s_axis_tvalid, s_axis_tdata защелкнится на входе ФИФО по фронту клока?
  8. Кажется эта ситуация называется race condition. Данные и valid меняются "одновременно" с клоком, поэтому новые значения могут захватиться либо на текущем клоке, либо только на следующем (на усмотрение симулятора). Поставьте после @(posedge aclk) небольшую паузу #1 и тогда изменения сигалов будет гарантированно после фронта слока. По этому поводу (и по многим другим) очень рекомендую почитать книжку Verilog and system verilog gotchas. 101common coding errors and how to avoid them.
  9. Например у Ксайлинкса в документе ug687 в разделе 6 HDL coding techniques http://www.xilinx.com/support/documentatio..._4/xst_v6s6.pdf
  10. Кажется в блоке always нужно заменить блокирующее присваивание на неблокирующее. То есть вместо = использовать <=
  11. Неужели действительно Квартус выкидывает логику, которая идет на пины, которым присвоено "virtual pins" ?
  12. Про мультицикл уже ответили. Когда я разбирался, мне очень помогли статьи здесь http://embedders.org/content/timequest-dly...bnyi-multicycle
  13. Проект можно сохранить File->Write Project TCL Запустив потом этот скрипт, Vivado заново создаст проект со всеми настройками и т.д.
  14. Если вы про сигнал CLK_DIV, то да, после CLK_DIV = "1111" будет CLK_DIV = "0000"
  15. Странно. Я Вам привел конкретный пример когда система моделирования воспринимает результат взятия элемента знакового массива как беззнаковый результат. Полностью подходит под Ваш пример (хотя у Вас не указано, как объявлена переменная rdata_ptr). Впрочем, не вижу смысла Вам чего-то доказывать.
  16. я как то делал компонент перевода дробной части в BCD. Кажется алгоритм основан на Shift and Add 3. Сейчас уже не помню. Вот код LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_ARITH.ALL; USE IEEE.Math_real.ALL; ENTITY tr3_bin2bcd_frac IS GENERIC( InputWidth : integer := 16; OutputDigits : integer := 16 ); PORT( clk : IN STD_LOGIC; d : IN std_logic_vector (InputWidth-1 DOWNTO 0); q : OUT std_logic_vector (4*OutputDigits-1 DOWNTO 0); q_we : OUT STD_LOGIC; nrst : IN std_logic; int_ready : IN std_logic := '1'; frac_ready : BUFFER std_logic ); -- Declarations END tr3_bin2bcd_frac; architecture Behavioral of tr3_bin2bcd_frac is constant NumberOfDigits: integer := OutputDigits; --constant NumberOfDigits: integer := integer(Ceil(real(InputWidth) * 0.30103)); --constant NeededOutputWidth: integer := NumberOfDigits * 4; type TCorrectTable is array(0 to 15) of std_logic_vector(3 downto 0); constant Correct8_sub3: TCorrectTable := (x"0", x"1", x"2", x"3", x"4", x"5", x"6", x"7", x"5", x"6", x"7", x"8", x"9", x"A", "----", "----" -- max input = 13(dec) ); signal dBuf: std_logic_vector(InputWidth-1 downto 0); -- буфер аргумента signal qBuf: std_logic_vector(4*OutputDigits-1 downto 0); -- буфер результата type TState is (Buffering, Shifting); signal State, LastState: TState; signal ShiftCounter: integer range 0 to InputWidth-1; signal first_flag : boolean := true; begin process(clk, nrst) variable tmpBuf_v : std_logic_vector(qBuf'left downto 0); begin if nrst = '0' then dBuf <= (others => '0'); qBuf <= (others => '0'); ShiftCounter <= 0; State <= Buffering; q <= (others => '0'); q_we <= '0'; first_flag <= true; frac_ready <= '0'; elsif rising_edge(clk) then -- default value q_we <= '0'; LastState <= State; -- fsm case State is when Buffering => if LastState /= Buffering then q <= qBuf; q_we <= '1' and int_ready; end if; frac_ready <= '1'; dBuf <= d; qBuf <= (others => '0'); ShiftCounter <= InputWidth-1; if (dBuf /= d or first_flag) and (int_ready = '1' and frac_ready = '1') then first_flag <= false; State <= Shifting; frac_ready <= '0'; end if; when Shifting => tmpBuf_v := dBuf(0) & qBuf(qBuf'left downto 1); for i in NumberOfDigits downto 1 loop qBuf(i*4-1 downto i*4-4) <= Correct8_sub3(CONV_INTEGER(unsigned(tmpBuf_v(i*4-1 downto i*4-4)))); end loop; dBuf <= dBuf(0) & dBuf(InputWidth-1 downto 1); if ShiftCounter = 0 then State <= Buffering; frac_ready <= '1'; else ShiftCounter <= ShiftCounter - 1; end if; when others => State <= Buffering; end case; end if; end process; end Behavioral; Все должно работать. Вход int_ready можно не использовать и подать на него 1.
  17. Может быть это не выбор бита, а выбор элемента массива и они различаются по своему поведению, но симулятор считает logic signed [3:0] ptr [15:0]; ... ptr_i = ptr; - расценивается как signed а logic signed [15:0] [3:0] ptr; ... ptr_i = ptr; - расценивается как unsigned
  18. rdata_ptr[1] - является беззнаковым вне зависимости от типа rdata_ptr смотри 5.5.1 Rules for expression types (из IEEE.1364-2005 на Verilog) "— Bit-select results are unsigned, regardless of the operands. — Part-select results are unsigned, regardless of the operands even if the part-select specifies the entire vector. reg [15:0] a; reg signed [7:0] b; initial a = b[7:0]; // b[7:0] is unsigned and therefore zero-extended " соответственно индекс rdata_ptr[1] - i тоже беззнаковый.
  19. В симуляторе путь такой, как я написал. Через индекс в [] скобках gen[2].U0.signal_name
  20. B SV (verilog) можно обратиться к сигналу внутри модуля по иерархии, типа U0.signal_name Как можно обратиться к сигналу, находящемуся в модуле, который написан внутри конструкции generate? Например: genvar i; generate for (i=0; i<5; i++) begin : gen module_name U0 (.....); end :gen endgenerate обращение gen[2].U0.signal_name выдает ошибку, что нет такого пути.
  21. Можо таким компонентом: LIBRARY ieee; USE ieee.std_logic_1164.all; USE ieee.std_logic_arith.all; USE ieee.std_logic_textio.all; USE ieee.std_logic_unsigned.all; LIBRARY std; USE std.textio.all; ENTITY print_result IS GENERIC( file_name : string := "D:/file_name"; d_width : natural := 8 ); PORT( clock : IN std_logic; we : IN std_logic; result : IN std_logic_vector (d_width-1 DOWNTO 0) ); END print_result ; ARCHITECTURE rtl OF print_result IS BEGIN -- pragma synthesis_off hi_clk_wr : process(we,clock) file vectorw_file : text open write_mode is file_name & ".txt" ; variable l , l2 : line ; variable q , p : integer := 0 ; variable count : integer := 1 ; begin if (we = '1') then if(clock='1' and clock'event) then q := d_width - 1 ; count := count + 1 ; for p in 1 to d_width loop -- data from RAM write(l2 , result(q)) ; q := q - 1 ; end loop ; q := d_width - 1 ; writeline(vectorw_file , l2) ; end if ; end if ; end process ; -- pragma synthesis_on END rtl;
×
×
  • Создать...