Verilog: $ se muestra con _ separador

4

En Verilog, uno puede usar convenientemente _ en cualquier lugar en literales binarios y hexadecimales. Por ejemplo, 8b0101_0011 y 32'hAEBB_23AF son literales válidos.

¿Es posible que $display haga algo similar? Estoy tratando de mostrar una señal de 64 bits en hexadecimal, que tiene 16 caracteres y es difícil de analizar visualmente. Me gustaría un _ cada cuatro caracteres para facilitar la lectura.

    
pregunta Randomblue

2 respuestas

4

No hay una forma automática de hacer que $display haga eso. Pero puedes formatearlo tú mismo para hacer eso.

Por ejemplo, esto imprimirá un valor de 64 bits como usted quería, con un prefijo 0x a la cadena.

$display("0x%04h_%04h_%04h_%04h", d[63:48], d[47:32], d[31:16], d[15:0]);

En este caso, es importante imprimir los ceros iniciales; eso es lo que significa 0 en 04 .

Si estuviera haciendo esto y usándolo más de una vez, también lo envolvería en una función.

    
respondido por el dwikle
0

Si su simulador admite la sintaxis de SystemVerilog, aquí hay una función que puede usarse para mostrar enteros de hasta 64 bits. Los valores más amplios requieren múltiples llamadas a la función. La función puede mostrar valores como binarios, decimales o hexadecimales.

module tb;

function string fmt (longint num, string radix, int width = 1);
    // Convert integer input into a string with underscores
    // for $display.  For example: 12345 -> 12_345.
    // radix should be [d|h|b].
    // width can be used for zero-padding on the left.
    // Any x/z passed into num gets converted to 0.
    // Reals passed into num are rounded to an integer.
    // Values greater than 64-bit are truncated.
    int pos, chars;
    string str, str2, fmtstr;
    str2 = "";

    fmtstr = {"%0", $sformatf("%0d", width), radix};
    str = $sformatf(fmtstr, num);

    chars = (radix == "d") ? 3 : 4;
    pos = 0;
    for (int i = str.len()-1; i>=0; i--) begin
        pos++;
        str2 = {str.getc(i), str2};
        if (pos % chars == 0) str2 = {"_", str2};
    end

    // Remove any leading underscore
    if (str2.getc(0) == "_") begin
        str2 = str2.substr(1, str2.len()-1);
    end
    return str2;
endfunction


reg [127:0] big;
reg [ 63:0] data;

initial begin
    data = 64'hfeed1234;
    $display(fmt(data, "h"));

    $display(fmt(98765, "d"));
    $display(fmt(33, "b", 8));

    big = 128'h123456789abcdef0777788889999aaaa;
    $display({fmt(big[127:64], "h"), "_", fmt(big[63:0], "h", 16)});
end

endmodule

/*

Output:

feed_1234
98_765
0010_0001
1234_5678_9abc_def0_7777_8888_9999_aaaa

*/
    
respondido por el toolic

Lea otras preguntas en las etiquetas