Как заставить один бит в массиве бит в systemverilog?

Глобальная опция

stringsAsFactors: параметр по умолчанию для аргументов data.frame и read.table.

может быть чем-то, что вы хотите установить на FALSE в ваших файлах запуска (например, ~ / .Rprofile). См. help(options).

0
задан hk56740 21 January 2019 в 01:54
поделиться

2 ответа

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

array_a[i] <= new_value;

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

0
ответ дан Russell 21 January 2019 в 01:54
поделиться

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

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

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

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

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
ответ дан RookieHere 21 January 2019 в 01:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: