в отношении всегда блока при внедрении ARM CPU в Verilog - PullRequest
0 голосов
/ 21 ноября 2018

Я пытаюсь реализовать файл регистра в процессоре ARM в Verilog.Я очень новичок в verilog, поэтому у меня возникли проблемы.

Я хочу сохранить файл регистра в его 15-м регистре, значение PC + 8, а в номере регистра 0 - значение 0 в начале, так чторегистровый файл может выдавать PC + 8 в качестве вывода, когда его вход для одного из регистров чтения равен 15 и т. д.

В настоящее время я написал код, подобный этому

reg[31:0] register[15:0];   

initial 
begin
    register[15] = register15;//register15 is the input holding PC+8 as it's value
    register[0] = 32'h00000000;
end
always @(posedge clk)
begin
    outreg1 <= register[A1];// outreg1,2 are outputs (values of register A1, A2)
    outreg2 <= register[A2];
end

Тем не менее, я хочу, чтобы все это происходило в режиме clk, когда происходит 'register-read'.Но если я сделаю это, придется ли мне делать все операторы в всегда @ (posedge clk) блокирующим присваиванием '=', чтобы привести его в порядок и назначить сначала 15 и 0?

Мое понимание блокирующих и разблокирующих назначений не очень ясно, поэтому я не уверен, сработает ли это или нет.

1 Ответ

0 голосов
/ 21 ноября 2018

Таким образом, это выглядит как попытка переназначения входных значений 'register0, ... register15' в набор 'outreg1 ...' с использованием 'A1 ...' в качестве манипуляторов карты.

В этом случае вы не можете использовать блок initial.Начальный блок запускается только один раз в симуляции в начале и не может реагировать на входные изменения.Они также не синтезируются.Поскольку вы сказали, что 'registerN' также являются входными данными, вам лучше создать 2 разных Always_blocks;

reg[31:0] register[15:0];   

always @* 
begin
    register[15] = register15;//register15 is the input holding PC+8 as it's value
    register[0] = 32'h00000000;
end

always @(posedge clk)
begin
    outreg1 <= register[A1];// outreg1,2 are outputs (values of register A1, A2)
    outreg2 <= register[A2];
end

Разница между блокирующими и неблокирующими назначениями заключается в том, что при неблокирующих назначениях будет назначено реальное значениек переменным позже, после того, как вся оценка поставлена ​​для всех таких блоков в проекте.Это позволяет симуляции вести себя как аппаратные средства в отношении флопов и защелок.то есть, если у вас есть один флоп A, кормящий другой флоп B в том же 'posedge clk', флоп B поймает выход A, как он существовал до поседжа.Так ведет себя аппаратная часть.При блокирующих назначениях результат моделирования будет непредсказуемым в этом случае, в зависимости от реализации симулятора.

Таким образом, практическое правило заключается в использовании неблокирующего назначения для всех «выходов» alwaysблоки, представляющие защелки и провалы.Все остальное должно быть блокирующим.Это означает, что блоки flop / latch могут использовать блокировку для промежуточных переменных при необходимости, но этого лучше избегать.

...