Два всегда блокируются в одном модуле. Если следующая техника неверна, кто-нибудь предложит мне альтернативный способ - PullRequest
0 голосов
/ 06 мая 2020

Я использую два всегда блока в одном модуле. Вызовет ли это ошибку синтезируемого кода? Исходный код написан на Verilog, приведенном ниже

module Mux (input wire[7:0] iterate, input wire deterministicEnable, input wire bistMode, input wire enable, input wire clk, input wire rst, output reg[127:0] valueO);

    reg [9:0] seedVal[0:2];
    reg[31:0] generatePattern [0:3],temp;
    integer i;

    always begin
        @(deterministicEnable)begin
            if(deterministicEnable==1)begin
                temp<={22'b000000000000,seedVal[iterate]};
            end
        end
    end

    always@(posedge clk)begin
        if(rst)begin
            temp<=32'b11111111111111111111111111111111;
            seedVal[0]<=10'b1001100101;
            seedVal[1]<=10'b1111111111;
            seedVal[2]<=10'b0000011111;
            generatePattern[0]<=32'b00000000000000000000000000000000;
            generatePattern[1]<=32'b00000000000000000000000000000000;
            generatePattern[2]<=32'b00000000000000000000000000000000;
            generatePattern[3]<=32'b00000000000000000000000000000000;
        end
        else begin
            if((bistMode==1) && (enable==1))begin
                for(i=0;i<4;i=i+1)begin
                    temp = {(temp[31] ^ temp[25] ^ temp[22] ^ temp[21] ^ temp[15] ^ temp[11] ^ temp[10] ^ temp[9] ^ temp[7] ^ temp[6] ^ temp[4] ^ temp[3] ^ temp[1] ^ temp[0]), temp[31:1]};
                    generatePattern[i] = temp;
                end
                valueO = {generatePattern[3],generatePattern[2],generatePattern[1],generatePattern[0]};
            end
        end
    end
endmodule

Ответы [ 2 ]

3 голосов
/ 06 мая 2020
  1. Как предположил Дэвид, это невозможно синтезировать, потому что вы управляете temp из 2 разных блоков always. Чтобы заставить его работать, вам нужно объединить их обоих в один.

  2. первый всегда представляет собой полный беспорядок, который будет вести себя как беспорядочный флоп при моделировании из-за усеченного список чувствительности. Даже если инструменты синтеза что-то сделают с блоком, результат не будет соответствовать моделированию.

  3. Второй блок может быть синтезируемым, но он, вероятно, будет вести себя иначе на аппаратном уровне, чем при моделировании из-за на смешанное использование назначений блокировки / неблокирования для одних и тех же варов.

Итак, что делать.

  1. вам нужно создать единственный всегда блок из двух из них. Трудно понять, каковы ваши намерения, но в целом это, вероятно, будет выглядеть так:
always @(posedge clk) begin
    if (rst) ...
    else if (deterministicEnable) ...
    else if if((bistMode==1) && (enable==1)) ..
end

кажется, что и temp, и generatePattern являются внутренними переменными и не требуют сброса. Итак, удалите их из if (rst) cluase. Я вообще не вижу необходимости в temp в вашем коде. Вы можете удалить его полностью. Также нет смысла использовать seedVal, поэтому я не понимаю, зачем вы их вообще инициализируете.

вы правы, используя назначения блокировки (=) для присвоения temp и до generatePattern, потому что это внутренние переменные. Однако value0 не является внутренним, и вы должны использовать nba (<=) для назначения. По этой причине переменная <code>value0 должна быть инициализирована сигналом rst, это не так.

1 голос
/ 06 мая 2020

Нет, это не синтезируется, блок always создает драйвер для всех назначенных в нем сигналов, и каждый сигнал всегда должен иметь только один драйвер (игнорируя некоторые исключения для трех состояний, которые здесь не актуальны).

always begin
    @(deterministicEnable)begin
* Насколько мне известно, 1003 * также не поддается синтезу. Если вам нужен комбинационный (не синхронизированный), используйте always @* begin.
...