Как заставить один бит в массиве бит в systemverilog? - PullRequest
0 голосов
/ 17 января 2019

Я сейчас пытаюсь ввести бит в массив битов. Положение бита, который нужно «форсировать», зависит от переменной i, в то время как другие биты сохраняют 0. например, если у меня есть массив бит [2:0] A когда i=0, я хочу, чтобы A было 3'b001, когда i=1, A должно быть 3'b010, когда i=2, A должно быть 3'b100 но я должен использовать оператор Force, так как я пишу testbench для проверки пути сигналов. Кто-нибудь знает, как я могу это сделать?

обновление 1: @Serge Я должен использовать оператор force, он был объявлен так: bit [31: 0] A Я пробовал это: force A [31: 0] = 32'd0; для (int i = 0; i <= 31; i ++) начинаются силы A [i] = 1; Конец Очевидно, это не работает. На самом деле я тестировал разные сценарии, чтобы увидеть, правильно ли пройден путь сигнала </p>

update2: теперь я сгенерировал скрипт для принудительной подачи сигнала один за другим Тем не менее, я не уверен, сталкиваюсь ли я с ошибкой или нет когда это утверждение выполнено а [31: 0] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0, `TOP_TB.clk_1T, 0}; a [1] остается равным 0. Вместо этого 1T clk появляется при a [0]. Кто-нибудь знает, что происходит?

update3: спасибо за вашу помощь !! Я действительно думал, что 0 интерпретируются в 32 битах, но я действительно не знаю, почему 1T clk появляется на бите 0 вместо бита 1 (я использую questasim) , Кстати, я решил эту проблему, сгенерировав скрипт, скопировав и вставив содержимое в текстовый файл, сгенерированный скриптом.

Ответы [ 3 ]

0 голосов
/ 17 января 2019

Systemverilog не позволяет форсировать битовый фрагмент вектора, поэтому вам придется форсировать всю сеть. Хорошая стратегия заключается в том, чтобы заставить сеть быть: force A = A ^ my_force_vector; И установите my_force_vector на биты, которые вы хотите принудительно установить.

Смотрите этот ответ здесь: https://stackoverflow.com/a/50845703/6262513

0 голосов
/ 20 января 2019

Из Справочного руководства по языку (IEEE Std 1800-2017), раздел 10.6.2 («Формулировка и освобождение процедурных заявлений»):

Левая часть назначения может быть ссылкой на единственную переменную, сетку, постоянный выбор битов векторной сети, постоянный частичный выбор векторной сети или их совокупность. Он не должен быть битовым или частичным выбором переменной или сети с определенным пользователем типом сети.

Похоже, что невозможно сделать то, что вы хотите напрямую.

Моя лучшая ставка на выполнение более или менее того, что вы хотите сделать (я просто заставил один бит и оставил остальные развиваться как обычно), имея в виду, что LHS назначения силы должен быть постоянным, это что-то вроде это:

module dut (
    input   logic   [31:0]  a,
    input   logic   [31:0]  b,
    output  logic   [31:0]  z
);

    always_comb z = a & b;

endmodule: dut

module tb;
    logic [31:0] a;
    logic [31:0] b;
    logic [31:0] z;

    dut dut (.*);

    logic clk = 0;
    initial forever
        #(5ns) clk = !clk;

    logic [5:0] sel;
    initial forever begin
        case (sel)
            6'd0: force z[0] = clk;
            6'd1: force z[1] = clk;
            6'd2: force z[2] = clk;
            6'd3: force z[3] = clk;
            6'd4: force z[4] = clk;
            6'd5: force z[5] = clk;
            6'd6: force z[6] = clk;
            6'd7: force z[7] = clk;
            6'd8: force z[8] = clk;
            6'd9: force z[9] = clk;
            6'd10: force z[10] = clk;
            6'd11: force z[11] = clk;
            6'd12: force z[12] = clk;
            6'd13: force z[13] = clk;
            6'd14: force z[14] = clk;
            6'd15: force z[15] = clk;
            6'd16: force z[16] = clk;
            6'd17: force z[17] = clk;
            6'd18: force z[18] = clk;
            6'd19: force z[19] = clk;
            6'd20: force z[20] = clk;
            6'd21: force z[21] = clk;
            6'd22: force z[22] = clk;
            6'd23: force z[23] = clk;
            6'd24: force z[24] = clk;
            6'd25: force z[25] = clk;
            6'd26: force z[26] = clk;
            6'd27: force z[27] = clk;
            6'd28: force z[28] = clk;
            6'd29: force z[29] = clk;
            6'd30: force z[30] = clk;
            6'd31: force z[31] = clk;
        endcase
        @(clk or sel);
        release z[0];
        release z[1];
        release z[2];
        release z[3];
        release z[4];
        release z[5];
        release z[6];
        release z[7];
        release z[8];
        release z[9];
        release z[10];
        release z[11];
        release z[12];
        release z[13];
        release z[14];
        release z[15];
        release z[16];
        release z[17];
        release z[18];
        release z[19];
        release z[20];
        release z[21];
        release z[22];
        release z[23];
        release z[24];
        release z[25];
        release z[26];
        release z[27];
        release z[28];
        release z[29];
        release z[30];
        release z[31];
    end

    initial begin
        a = 32'h0055aaffaa55ff00;
        b = 32'habcdef0123456789;
        sel = 6'd0;
        #(98ns);
        sel = 6'd6;
    end
endmodule: tb

Это работает на моей версии ModelSim (INTEL FPGA STARTER EDITION 10.6c).

А почему ваш код:

a[31:0] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,`TOP_TB.clk_1T,0};

не работает, я думаю, что каждый "0" интерпретируется как целое число 0, то есть 32'd0. Тогда у вас действительно есть что-то на линии:

a[31:0] = {960'd0, `TOP_TB.clk_1T, 32'd0};

и RHS усекается до 32 бит. Усечение, конечно, подразумевает, что все, что осталось от «32'd0», отбрасывается, но ваш компилятор должен действительно выдать предупреждение об этом. Что-то вроде:

a[31:0] = {30'b0,`TOP_TB.clk_1T,1'b0};

у меня работает. Вы, конечно, можете вставить эту конструкцию в «случай», который я использовал и в моем примере.

0 голосов
/ 17 января 2019

Вы можете использовать битовую индексацию в verilog, чтобы делать то, что вы хотите. Это как индексирование в массив на C. Например:

array_a[i] <= new_value;

В приведенном выше коде, если i равно 0, он назначит new_value для бита 0 и оставит остаток без изменений.

...