Предупреждение следует использовать в методе генерации цикла scary_jeff. параллельный оператор в цикле генерации приведет к отдельному процессу с отдельным драйвером в каждом сгенерированном блоке, что означает, что вы не можете назначить (33) для cache_array (i) из другого процесса без разрешения на метазначение.
Метод генерации цикла обычно не полезен без описания всей операции кеша в одном процессе.
Там также третий способ, использующий и маскирующий знакомо тем, с фоном программирования, который используется для установки cache_array (I), (33) к «0»:
library ieee;
use ieee.std_logic_1164.all;
entity cache is
end entity;
architecture foo of cache is
type CacheArray is array(0 to 15) of std_logic_vector(33 downto 0);
signal cache_array: CacheArray := (others => (others => '1'));
constant MASK33: CacheArray := (others => (33 => '0', others => '1'));
function "and" (l,r: CacheArray) return CacheArray is
variable retval: CacheArray;
begin
for i in l'range loop
retval(i) := l(i) and r(i);
end loop;
return retval;
end function;
function to_string (arg: CacheArray) return string is
variable retval: string (1 to CacheArray'length * 36);
variable retptr: natural range 1 to CacheArray'length * 36;
begin
retptr := 1;
for i in arg'range loop
for j in arg(i)'range loop
if j = arg(i)'left then
retval(retptr) := LF;
retptr := retptr + 1;
retval(retptr) := HT;
retptr := retptr + 1;
end if;
retval(retptr) :=
character'VALUE(std_ulogic'IMAGE(arg(i)(j)));
if retptr < retval'length then
retptr := retptr + 1;
end if;
end loop;
end loop;
return retval;
end function;
begin
-- GenerateLabel:
-- for i in cache_array'range generate
-- cache_array(i)(33) <= '0';
-- end generate;
--
-- Clear_33:
-- process (cache_array)
-- begin
-- for i in cache_array'range loop
-- cache_array(i)(33) <= '0';
-- end loop;
-- end process;
MASK:
process (cache_array)
begin
cache_array <= cache_array and MASK33;
end process;
SHOW:
process (cache_array)
begin
report "cache_array = " & to_string(cache_array);
end process;
end architecture;
Поскольку требуется определение «и» оператор для типа CacheArray, это приведет к получению функции to_string для типа CacheArray, а также, что может сказать нам содержимое кэша:
ghdl -r cache
cache.vhdl:67:9:@0ms:(report note): cache_array =
1111111111111111111111111111111111
1111111111111111111111111111111111
1111111111111111111111111111111111
1111111111111111111111111111111111
1111111111111111111111111111111111
1111111111111111111111111111111111
1111111111111111111111111111111111
1111111111111111111111111111111111
1111111111111111111111111111111111
1111111111111111111111111111111111
1111111111111111111111111111111111
1111111111111111111111111111111111
1111111111111111111111111111111111
1111111111111111111111111111111111
1111111111111111111111111111111111
1111111111111111111111111111111111
cache.vhdl:67:9:@0ms:(report note): cache_array =
0111111111111111111111111111111111
0111111111111111111111111111111111
0111111111111111111111111111111111
0111111111111111111111111111111111
0111111111111111111111111111111111
0111111111111111111111111111111111
0111111111111111111111111111111111
0111111111111111111111111111111111
0111111111111111111111111111111111
0111111111111111111111111111111111
0111111111111111111111111111111111
0111111111111111111111111111111111
0111111111111111111111111111111111
0111111111111111111111111111111111
0111111111111111111111111111111111
0111111111111111111111111111111111
Первое значение кэша представляет собой первоначальное значение, то второй результат из "и" mask (обратите внимание, что я первоначально заполнял cache_array w с «1», чтобы показать «и» работал).
Вы можете добавить дополнительные разделители полей для своего кеш-слова, чтобы упростить их чтение и использовать такие вещи, как использование конкретного радикса, отметив, что вы отвечаете за правильную длину строки retval и управляете указателем retval (retptr) в to_string. Вы можете зайти так далеко, чтобы добавить выходной заголовок. Вы также можете организовать вывод на основе строки кэша. ...
В дополнение к операторам отчетов textio может использоваться для более тонкого управления выходом и перенаправления в текстовый файл. Любой может позволить вам наблюдать за состоянием кэша, не прибегая к просмотру отображаемых форм сигналов.
Я хочу сделать этот бит '' 0'' для всех индексов массива. Я попробовал эти сравнения (15 downto 0) (32) <= '0'; ', но я получаю сообщение об ошибке' Cache.vhd: 65: 28: static constant нарушает границы'. – martianwars
@ KalpeshKrishna OK, я просто пытался объяснить, почему ваш код вызывает ошибки. См. Мое редактирование. –
Я не знал об этих операторах 'generate'. Все это действительно дает синтезируемый код? Это выглядит действительно полезно! – martianwars