2014-02-12 5 views
-1

Я хотел бы создать экземпляр массива регистров и объявить их все в соответствии с определенной функцией. Это для блока множителей, который я надеюсь построить.Синтаксис двумерного массива Verilog

Код я работаю с ниже, но это линия, что компилятор не оценит:

q[i][7:0] = {8{a[i]}} & b[7:0]; 

Так как код написан, я надеюсь сделать регистры д [0] , q [1], .... q [7] все сохраняют 8-битное значение, определяемое RHS выше. Может ли кто-нибудь сказать мне, что было бы правильным способом сделать это?

Весь код:

`timescale 1ns/1ps 

module multiplier_2(
    input [7:0] A, 
    input [7:0] B, 
    output reg [15:0] P, 
    input start, 
    output stop 
    ); 

reg [7:0] q[7:0]; 
reg P = 0; 
//create 8 bit vectors q[i] 
genvar i; 
generate 
for (i = 0; i < 8;i = i+1) 
begin: loop 
    q[i][7:0] = {8{a[i]}} & b[7:0]; 
end 
endgenerate 

always @ (*) 
begin 
    if (start == 1'b1) 
    begin 
     for (i = 0; i < 8; i = i+1) 
     begin 
      P = P + (q[i] << i); 
     end 
    end 
end 

endmodule 

EDIT: этот код также не работает: сообщение

`timescale 1ns/1ps 

module multiplier_2(
    input [7:0] a, 
    input [7:0] b, 
    output reg [15:0] P = 16'd0, 
    input start, 
    output stop 
    ); 

reg [7:0] q[7:0]; 
//create 8 bit vectors q[i] 
genvar i; 
generate 
always begin 
    for (i = 0; i < 8;i = i+1) 
    begin: loop 
     q[i] = {8{a[i]}} & b[7:0]; 
    end 
end 
endgenerate 

always @ (*) 
begin 
    stop = 1'b0; 
    if (start == 1'b1) 
    begin 
     for (i = 0; i < 8; i = i+1) 
     begin 
      P = P + (q[i] << i); 
     end 
    end 
    stop = 1'b1; 
end 

endmodule 

Ошибка:

«Line 16: процедурное назначение к не-регистр i не разрешен, левая сторона должна быть reg/integer/time/genvar "

+0

'q [0] [7: 0] = {8 {a [0]}} & b [7: 0];' не будет действительным verilog. Ему нужен «присваивать» для типа провода или внутри 'always' для типа reg. – Morgan

+0

Если я положил его внутри «initial», он все равно не принимает его. То же самое происходит всегда. Редактирование на моем операторе также имеет код, который не работает. – triplebig

+0

Может ли кто-нибудь дать представление о том, почему я был заблокирован, поэтому я могу улучшить в будущем? – triplebig

ответ

2

Я не думаю, что для этого требуется инструкция generate. Стандарт для петли будет работать:

reg [7:0] q [0:7]; 
integer i; 
always @* begin 
    for (i = 0; i < 8; i=i+1) begin: loop 
     q[i] = {8{a[i]}} & b[7:0]; 
    end 
end 

Остерегайтесь того оборудования, которое вы подразумеваете. Для циклов, подобных операторам генерации, подразумевается параллельное оборудование.

NB: она более распространена в список памяти с глубиной от 0 до х, а именно: reg [7:0] q [0:7];

1

У вас есть все виды вопросов здесь. Во-первых, вы сбиты с толку о том, что такое оператор generate, и что вы пытаетесь сгенерировать. Вы (1) пытаетесь создать один блок always, который должен содержать последовательный/процедурный код, или вы (2) пытаетесь генерировать/копировать 8 непрерывных заданий?

Вы, по-видимому, не выполняете (1), так как нет никакого смысла в генерации одного блока always; generate является избыточным. Это оставляет (2). Итак, избавьтесь от always begin после generate. i в вашем цикле теперь является «genvar» или переменной поколения, и вы копируете 8 заданий; Все идет нормально. Избавьтесь от begin:loop и end; вы копируете одно утверждение, так что это бессмысленное словоблудие.

Следующая проблема: генерировать цикл теперь создает параллельную или параллельных заявления; в Verilog-talk, они являются заявлениями на уровне модулей. Они означают, что они должны быть непрерывными присваиваниями, то есть они должны иметь перед ними assign, а не просто обычные процедурные задания, как вы их написали. Это также означает, что q должен быть объявлен как wire, а не reg. Для этого нет веской причины; это просто, как Verilog.

Теперь у вас есть второй блок always, который является параллельным (модульным) оператором, который должен содержать последовательный/процедурный код.i, на который вы ссылаетесь в этом блоке, это оригинал genvar, который не работает. A genvar может использоваться только в особых обстоятельствах, связанных с генерацией; это не внутри generate, и вам нужна обычная переменная здесь как ваш индекс. вы можете сделать это, называя свой внешний begin/end и объявляя переменную внутри нее или любым другим способом. Теперь вы узнаете, что вы создаете процедурное назначение в сети stop; это незаконно, поэтому измените заявление stop в реестр. Этого должно быть достаточно, чтобы ваш код мог компилироваться.

BTW, @(*) является подробным и ненужным и исторически путают хотя бы один инструмент. @* более кратким.

У вас есть другие проблемы. Ваш второй always содержит цикл. Похоже, это может быть логически корректно, но ваш синтезатор должен развернуть это и выполнить 8 дополнений и установить stop. Это не будет работать в реальной жизни. Подумайте о том, как создавать эти дополнения одновременно и помещать их в generate или создавать синхронизированный конвейер и еще один надежный (синхронизированный) способ создания stop.

+0

Да, я смущен тем, что генерирует. Я читал, что он работает в режиме предварительной компиляции, поэтому я подумал, что включение необходимых регистров может быть включено, но теперь я вижу, что меня путают. Почему бы второй цикл не работал в реальной жизни? – triplebig

+2

@triplebig у вас есть 'stop = 1'b0;' stop = 1'b1; 'В том же комбинаторном заявлении. Комбинаторные утверждения идеально моделируются за 0 раз. поэтому наличие сигнала, который изменяется между 2 значениями за 1 ход блока, не будет работать. – Morgan

Смежные вопросы