我试着把算术移到左边。如果我使用"i_a <<< i_b“而i_b是否定的(i_a和i_b是两个补语),会发生什么?它应该给错误或类似的东西,而不是它的工作方式。例如,如果我有i_a = 1010和i_b = 1000,那么i_a应该是-8位的移位器,因为i_b是负的。
以下是代码:
`timescale 1ns/1ps
`include "ashift_example1.sv"
module testbench;
parameter BITY = 4;
parameter OPER = 2;
logic [OPER-1:0] i_oper;
logic [OPER-1:0] i_rsn;
logic signed [BITY-1:0] i_argA,i_argB;
logic signed [BITY-1:0] o_result;
logic [1:0] o_status;
ashift_example1 #(.BITS(BITY)) Shift_left (.i_a(i_argA), .i_b(i_argB), .o_arith_left(o_result));
initial
begin
$dumpfile("signals.vcd");
$dumpvars(0,testbench);
i_argA = '0;
i_argB = '0;
#1
i_argA[3] = 1;
i_argA[1] = 1;
i_argB[0] = 1;
#1
i_argB[0] = 0;
i_argB[1] = 1;
#1
i_argB[1] = 0;
i_argB[3] = 1;
#1
$finish;
end
endmodule 这是个测试台。下面是一个模块:
module ashift_example1(i_a, i_b, o_arith_left);
parameter BITS = 4;
input logic signed [BITS-1:0] i_a, i_b;
output logic signed [BITS-1:0] o_arith_left;
// Blok opisujacy logike
always_comb
begin
// arytmetyczne przesuniecie o i_b bitow
// w lewo (w strone MSB)
o_arith_left = (i_a <<< i_b);
end
endmodule我正在使用SystemVerilog,因为这是我的学校告诉我要使用的。那我做错什么了?我对每一个输入和输出都使用了“签名”。
在gtkwave中,当i_b为负时,它仍然有效。我被告知要使用if循环来消除负i_b,但是当我用负值进行模拟时,它并没有给出一个错误。那么,为什么我要给这个如果循环公式,以消除负数,当他们不影响程序?
如果我有i_b = 1111和i_a = 1010,那么结果应该是什么呢?GTKwave显示o_y = 0000,尽管i_b = -1 (2的补码)。所以它应该向后移动?还是我在这里犯了个错误?
GTKwave应该给出没有定义的输出,而应该给出0000
发布于 2022-11-13 01:06:50
11.4.10换档操作员.右操作数始终被视为无符号数,对结果的签名性没有任何影响。..。
因此,你的两次恭维被视为一个无符号数,即-1 (2-称赞4‘b 1111)被视为15,并将左操作数在给定的方向上移动15个位置。
https://stackoverflow.com/questions/74416677
复制相似问题