我是编码verilog的新手。
这是3位比较器的代码。我需要帮助添加一个名为“US' (未签名/签名)到我的测试平台代码。当信号为高(无符号模式)时,比较器将数字解释为无符号数。当信号为低(签名模式)时,比较器将数字解释为带符号的数字。
module comparator(A,B,G,E,L,US);
input [2:0]A;
input [2:0]B;
input US;
output G,E,L;
reg G,E,L;
always@(*)
begin
if(US==0)
begin
L=$signed(A)<$signed(B);
E=$signed(A)==$signed(B);
G=$signed(A)>$signed(B);
end
else
L = A < B;
E = A==B;
G = A > B;
end
endmodule
TEST BENCH CODE:
`timescale 1ns /1ps
module comparator_tb();
reg [2:0]A=3'b000;
reg [2:0]B=3'b000;
reg US;
wire G,E,L;
integer i,j;
comparator uut(A,B,G,E,L,US);
initial begin
for(i=0;i<8;i=i+1)
begin
for(j=0;j<8;j=j+1)
begin
#50
B=B+1;
end
A = A+1;
B=3'b000;
end
#100
$stop;
end
endmodule
答案 0 :(得分:0)
我想你想在你的测试台上切换美国。类似下面的东西?
由于US被声明为wire
(默认),因此您需要assign
声明:
integer us_count;
assign US = us_count;
initial begin
for(us_count = 0; us_count < 1; us_count++) begin
for(i=0;i<8;i=i+1)
begin
for(j=0;j<8;j=j+1)
begin
#50
B=B+1;
end
A = A+1;
B=3'b000;
end
end
#100
$stop;
end
如果您将其声明为reg
,则可以直接在循环中使用它而不是us_count,并且不需要assign
reg US;
initial begin
for (US = 0; US < 1; US++)
...
其余的取决于你想要如何测试它。